Pertimbangkan kode sederhana ini:
void g();
void foo()
{
volatile bool x = false;
if (x)
g();
}
Anda dapat melihat bahwa tidak gcc
juga clang
mengoptimalkan potensi panggilan ke g
. Ini benar dalam pemahaman saya: Mesin abstrak mengasumsikan bahwa volatile
variabel dapat berubah setiap saat (karena misalnya perangkat keras-dipetakan), jadi melipat- false
inisialisasi inisialisasi menjadi if
cek akan salah.
Tetapi MSVC menghilangkan panggilan untuk g
sepenuhnya (menjaga membaca dan menulis volatile
meskipun!). Apakah perilaku sesuai standar ini?
Latar belakang: Saya kadang-kadang menggunakan konstruksi semacam ini untuk dapat mengaktifkan / menonaktifkan output debugging on-the-fly: Kompiler harus selalu membaca nilai dari memori, jadi mengubah variabel / memori selama debugging harus memodifikasi aliran kontrol sesuai . Output MSVC membaca ulang nilainya tetapi mengabaikannya (mungkin karena lipat dan / atau penghapusan kode mati), yang tentu saja mengalahkan niat saya di sini.
Suntingan:
Penghapusan membaca dan menulis
volatile
dibahas di sini: Apakah diizinkan untuk kompiler untuk mengoptimalkan variabel volatile lokal? (terima kasih Nathan!). Saya pikir standarnya sangat jelas bahwa membaca dan menulis itu harus terjadi. Tetapi diskusi itu tidak mencakup apakah legal bagi kompiler untuk mengambil hasil dari bacaan-bacaan itu dengan benar dan mengoptimalkan berdasarkan itu. Saya kira ini adalah standar yang tidak ditentukan , tetapi saya akan senang jika seseorang membuktikan saya salah.Saya tentu saja dapat membuat
x
variabel non-lokal untuk mengesampingkan masalah ini. Pertanyaan ini lebih karena penasaran.