şeklinde
volatile int* p;
bir işaretçi derleyici volatile
olarak tedavi edecek bir int
bir işaretçidir. Bu, derleyicinin, kaynak kodunda hiçbir şeyin bulunmadığını bildirmek için p
'un değiştiğine işaret eden değişken için olası olabileceğini varsayacağı anlamına gelir. Örneğin, düzenli bir tam sayıya işaret edecek şekilde p
ayarladıysam, okuyucusu *p
okuduğum veya yazdığım her zaman, değerin beklenmedik bir şekilde değişmiş olabileceğinin farkındadır.
bir volatile int*
için bir daha kullanım durumu yoktur: Bir int
volatile
olarak, o zaman normal bir int*
ile ona işaret etmemelidir beyan edin. Örneğin, bu kötü bir fikir:
volatile int myVolatileInt;
int* ptr = &myVolatileInt; // Bad idea!
Bunun nedeni C derleyicisi artık değişken ptr
volatile
olduğunu tarafından işaret hatırlar, bu yüzden yanlış bir kayıtta *p
değerini önbelleğe ihtimalidir . Aslında, C++ 'da, yukarıdaki kod bir hatadır. Bunun yerine, Şimdi
volatile int myVolatileInt;
volatile int* ptr = &myVolatileInt; // Much better!
yazmalı, derleyici ptr
bir volatile int
de puan, bu yüzden olmaz (ya da değil! Olmalı) optimize etmeyi deneyin *ptr
aracılığıyla erişen hatırlar.
Son bir ayrıntı - sen tartışılan işaretçi bir volatile int
bir göstericidir. Ayrıca yapabilirsiniz:
int* volatile ptr;
Bu işaretçi kendisi derleyici bellekte işaretçi önbelleğe deneyin ya işaretçi değerini optimize etmeye gerektiği anlamına gelir ki, volatile
olduğu belirtildiği için işaretçi kendisi
volatile int* volatile ptr;
Bu işaretçi ve pointee hem beklenmedik bir şekilde değişti alabilir söylüyor: Bu canavar almak istiyorsanız birlikte bu birleştirebilirsiniz başka bir şey (donanım, başka bir iş parçacığı, vb) tarafından tayin olur belki . Derleyici işaretçiyi kendiliğinden optimize edemez ve neyin işaret edildiğini optimize edemez.
Bu yardımcı olur umarız!
Bence "sen düzenli bir int ile işaret etmemelisin" demek istiyorsun " – markgz
@ markgz- Whoops! Evet doğru. Sabit. – templatetypedef
Bence C de bir hatadır, ama C derleyicileri tür uyumsuzluklarından şikayet etmeye daha az eğilimlidir. –