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
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!