Ş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 gcc
de clang
optimize edebilirsiniz g
. Bu benim anlayışım için doğru: Soyut makine volatile
değişkenlerin herhangi bir anda değişebileceğini varsaymaktır (örneğin donanım eşlemeli olması nedeniyle), bu nedenle false
başlatmayı if
kontrole sürekli katlamak yanlış olur.
Ancak MSVC, çağrıyı g
tamamen ortadan kaldırır (okumaları ve yazmaları yine de volatile
saklayı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ı
volatile
burada 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
x
yan adım için yerel olmayan bir değişken yapabilirim . Bu soru daha çok meraktan çıkıyor.