Rumah >pembangunan bahagian belakang >C++ >Mengapa Kod C Ini Menghasilkan Gelung Infinite pada GCC dengan Pengoptimuman Didayakan?

Mengapa Kod C Ini Menghasilkan Gelung Infinite pada GCC dengan Pengoptimuman Didayakan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-05 04:47:13796semak imbas

Why Does This C   Code Produce an Infinite Loop on GCC with Optimizations Enabled?

Limpahan Integer pada x86: Membongkar Teka-teki Gelung Infinite

Pertimbangkan coretan kod berikut yang secara misteri menjunam ke dalam gelung tak terhingga apabila disusun menggunakan GCC:

int i = 0x10000000;
do {
    i += i;
    cout << i << endl;
} while (i > 0);

Misteri Terbongkar

Walaupun limpahan integer lazimnya adalah gelagat yang tidak ditentukan, arahan aritmetik integer seni bina x86 lazimnya membungkus jika limpahan berlaku. Walau bagaimanapun, dalam kes ini, pengoptimuman GCC memperkenalkan anomali.

Misadventures Pengoptimuman

Dengan pengoptimuman didayakan, GCC menganggap limpahan integer adalah mustahil dan menghapuskan semakan keadaan keluar gelung. Akibatnya, apabila integer i dililitkan kepada nilai negatif, gelung itu berterusan tanpa henti.

Pengendalian Betul Visual Studio

Visual Studio, sebaliknya, mengendalikan limpahan integer dengan betul dan keluar dari gelung seperti yang dimaksudkan.

Menentukan Tidak Ditakrifkan Tingkah laku

Tingkah laku pelik ini menyerlahkan sifat tidak dapat diramalkan bagi tingkah laku yang tidak ditentukan. Walaupun pembalut integer dijangka pada x86, gelagat yang tidak ditentukan boleh nyata dalam cara yang tidak dijangka, mengecewakan ramalan pengkompil.

Penyelesaian

  • Lumpuhkan pengoptimuman (-O0) untuk menguatkuasakan limpahan eksplisit semak.
  • Gunakan bendera -fwrapv untuk mendayakan semantik limpahan yang jelas. Walau bagaimanapun, ambil perhatian tentang kemungkinan penalti prestasi.

Kesimpulan

Pilihan GCC untuk mengoptimumkan keadaan keluar gelung dengan kehadiran gelagat yang tidak ditentukan membawa kepada membingungkan gelung tak terhingga. Ini berfungsi sebagai peringatan tentang akibat yang tidak dapat diramalkan kerana melanggar peraturan tingkah laku yang tidak ditentukan, menuntut berhati-hati apabila bekerja dengan aritmetik integer pada platform x86.

Atas ialah kandungan terperinci Mengapa Kod C Ini Menghasilkan Gelung Infinite pada GCC dengan Pengoptimuman Didayakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn