Şu basit kodu düşünün:
void g();
void foo()
{
volatile bool x = false;
if (x)
g();
}
Potansiyel çağrıyı ne görebilir, ne gccde clangoptimize edebilirsiniz g. Bu benim anlayışım için doğru: Soyut makine volatiledeğişkenlerin herhangi bir anda değişebileceğini varsaymaktır (örneğin donanım eşlemeli olması nedeniyle), bu nedenle falsebaşlatmayı ifkontrole sürekli katlamak yanlış olur.
Ancak MSVC, çağrıyı gtamamen ortadan kaldırır (okumaları ve yazmaları yine de volatilesaklayın!). Bu standartlara uygun davranış mı?
Arka plan: Zaman zaman bu tür bir yapıyı hata ayıklama çıktısını anında açıp kapatabilmek için kullanıyorum: Derleyici her zaman bellekten değeri okumalıdır, bu nedenle hata ayıklama sırasında bu değişkenin / belleğin değiştirilmesi kontrol akışını buna göre değiştirmelidir. . MSVC çıktısı değeri yeniden okur ancak elbette burada niyetlerimi yenen değeri (muhtemelen sabit katlama ve / veya ölü kod eliminasyonu nedeniyle) yok sayar.
Düzenlemeler:
Okuma ve yazma işlemlerinin kaldırılması
volatileburada tartışılmıştır: Bir derleyicinin yerel değişken değişkenini optimize etmesine izin veriliyor mu? (teşekkürler Nathan!). Bence bu standart, bu okuma ve yazma işlemlerinin olması gerektiği kadar açık . Ancak bu tartışma, derleyicinin verilen okumaların sonuçlarını almasının ve buna göre optimize etmesinin yasal olup olmadığını kapsamaz . Sanırım bu standartta yetersiz / belirtilmemiş , ama biri beni yanlış kanıtlarsa mutlu olurum.Tabii ki
xyan adım için yerel olmayan bir değişken yapabilirim . Bu soru daha çok meraktan çıkıyor.