SORU
16 Temmuz 2015, PERŞEMBE


İşaretçi sürekli geçici olarak ilan etti

Okurken bildirimi ve aşağıdaki satırı - bu tür rastladım

const volatile char *p=(const volatile char *) 0x30;

P değeri dış koşullar tarafından değiştirilir

Ne dış koşullar anlamıyorum. Ve ayrıca bu tip pratik kullanımbeyannamesi?

CEVAP
16 Temmuz 2015, PERŞEMBE


const program akışı p ile işaret ne değişiklik olmadığını söyledi. İşaretçi kaldırma sonra değeri değiştirmek için herhangi bir girişim, bir derleme zamanı hatası neden olur:

*p = 'A'; // will not compile

Bu özellikle güçlü bir sözleşme değil, unutmayın; bir yerde değeri 0x30 hala olmayan sabit aliasing bir işaretçi, p Diğer ile değiştirilebilir:

volatile char *q = 0x30;
*q = 'A'; // will compile

Bu Sözleşme kırmak için başka bir yol p 12 *döküm uzakta

*(volatile char *) p = 'A'; // will compile

Başka bir iş parçacığı, çekirdek, asenkron sinyal işleyicisi veya aynı bellek alanı erişimi olan bir harici bir cihaz neden olabilir volatile ancak, herhangi bir değişiklik dışında bırakmaz. Bu şekilde derleyici olamaz değeri p ile gösterilen ve her zaman başvurulan bellekten yükle: değişmeyen yanlış varsayım yapmak

/*
 The character at 0x30 will be read on every iteration,
 even if the compiler has proven that the program itself
 doesn't modify the value at that address.
*/
while (*p) {
    ...
}

Eğer derleyici yanlışlıkla optimize böyle bir yapı olsaydı, değeri sadece bir kez bellekten yük olan talimatlar yayarlar ve bir kayıt tutmak olabilir. Kayıt aslında bağımsız bir kopya ve orijinal konumuna herhangi bir değişiklik yok yansımaz, ve, söylemeye gerek yok, bu çok kötü bazı hatalar neden olabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FOSDEM

    FOSDEM

    13 Ocak 2009
  • KendrickLamarVEVO

    KendrickLama

    9 ŞUBAT 2011
  • Le Cargo !

    Le Cargo !

    24 HAZİRAN 2007