Bir yapıyı uçucu hale getirmek tüm üyelerini uçucu hale getirir mi?


98

Sahip olursam:

struct whatever {
int data;
};
volatile whatever test;
test.datada uçucu olacak mı?


4
Harika soru. Bir volatileüye işlevine sahip olmanın sadece thisişaretçiyi uçucu hale getirdiğini okudum, böylece üyeler her erişildiğinde bellekten okunacak, ancak "resmi olarak" uçucu değiller.
Alexandre C.

2
Muhtemelen bir kopya , ama yine de iyi bir soru.
Sergei Tachenov

Yanıtlar:


123

Başka bir soru sorulabilir (veya orijinal soruya bakmanın başka bir yolu):

Bir yapı constoluşturmak tüm üyelerini oluşturur constmu?

Sahip olursam:

struct whatever { int data; };

const whatever test;

Test.data da olacak constmı?

Cevabım: Evet. Eğer türünde bir nesne bildirirseniz whateverile constsonra tüm üyelerinin olacak constçok

Eğer türünde bir nesne bildirin Benzer şekilde, whateverbirlikte volatilesonra tüm üyelerinin olacak volatilesen nesneyi ilan etmeleri halinde, tıpkı de const, tüm 's üyesi olacaktır constda.

constve volatileaynı madalyonun iki yüzüdür; onlar öyle ki Standart onlara sık sık atıfta bulunur cv-qualifiers.


Standarttan alıntı (7.1.5.1 $ / 8)

[Not: uçucu, uygulama için bir ipucudur nesnenin dahil olduğu agresif optimizasyondan kaçınmak yönelik çünkü nesnenin değeri, bir uygulama tarafından saptanamayan yollarla değiştirilebilir. Ayrıntılı anlamlar için 1.9'a bakın. Genel olarak, uçucu maddenin anlamının C + + 'da C'deki ile aynı olması amaçlanmıştır.]

Bu, nesneniz bir yapı örneğiyse, derleyicinin yapamayacağı anlamına gelir. nesneyi içeren agresif optimizasyonu önlemek , sürece o 's üyelerinin her birinin saldırgan optimizasyonu önler. (Aksi takdirde, nesnenin dahil olduğu optimizasyonu başka nasıl önleyebilir?)


İlgili konu:

Neden C ++ 'da uçucu anahtar kelime kullanıyoruz?


Sabitliğin yalnızca anlık üyelere yayıldığına dikkat etmek önemlidir. Yapınız bir nesneye bir işaretçi tutuyorsa, işaretçinin kendisi sabit olacaktır (örneğin, onu yeniden atayamazsınız), ancak işaret edilen nesneyi değiştirebileceksiniz. (yapınızın const'a işaret etmediğini varsayarsak)
Pablo Arias

-2

Kimden: http://msdn.microsoft.com/en-us/library/145yc477%28v=vs.80%29.aspx

İşaretçi tarafından işaret edilen nesneyi sabit veya uçucu olarak bildirmek için bir form bildirimini kullanın:

const char *cpch;
volatile char *vpch;

İşaretçinin değerini - yani işaretçide depolanan gerçek adresi - sabit veya geçici olarak bildirmek için, formun bir bildirimini kullanın:

char * const pchc;
char * volatile pchv;

4
Soruya cevap değil
Jakob van Bethlehem
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.