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

  • CHISTOSITOJAJA

    CHISTOSITOJA

    27 HAZİRAN 2010
  • Joshua Kywn

    Joshua Kywn

    17 Mayıs 2010
  • The Fashion Sight

    The Fashion

    22 AĞUSTOS 2011