Apakah membuat struct mudah menguap membuat semua anggotanya mudah berubah?

96

Jika saya memiliki:

struct whatever {
int data;
};
volatile whatever test;
akan test.databergejolak juga?

Menandai
sumber
4
Pertanyaan yang bagus. Saya membaca bahwa memiliki volatilefungsi anggota hanya membuat thispenunjuk mudah menguap, jadi anggota akan dibaca dari memori setiap kali mereka diakses tetapi tidak "secara resmi" mudah berubah.
Alexandre C.
2
Mungkin duplikat , tapi masih pertanyaan yang bagus.
Sergei Tachenov

Jawaban:

119

Pertanyaan lain dapat ditanyakan (atau cara lain untuk melihat pertanyaan asli):

Apakah membuat struct constmembuat semua anggotanya const?

Jika saya memiliki:

struct whatever { int data; };

const whatever test;

Akankah test.data constjuga?

Jawaban saya adalah: Ya. Jika Anda menyatakan objek tipe whateverdengan constmaka semua anggotanya akan constterlalu

Demikian pula, jika Anda mendeklarasikan objek bertipe whateverwith volatilemaka semua anggotanya akan menjadi volatilejuga, seperti jika Anda mendeklarasikan objek dengan const, semua anggotanya juga akan menjadi const.

constdan volatiledua wajah dari mata uang yang sama; mereka sehingga Standar sering menyebutnya sebagai cv-qualifiers.


Mengutip dari Standar ($ 7.1.5.1 / 8)

[Catatan: volatile adalah petunjuk implementasi untuk menghindari pengoptimalan agresif yang melibatkan objek karena nilai objek dapat diubah dengan cara yang tidak terdeteksi oleh implementasi. Lihat 1.9 untuk semantik rinci. Secara umum, semantik volatile dimaksudkan agar sama di C + + seperti di C.]

Artinya, jika objek Anda adalah instance dari struct, maka compiler tidak dapat menghindari pengoptimalan agresif yang melibatkan objek tersebut , kecuali jika menghindari pengoptimalan agresif dari setiap anggotanya. (Jika tidak, bagaimana lagi itu dapat menghindari pengoptimalan yang melibatkan objek?)


Topik terkait:

Mengapa kami menggunakan kata kunci volatile di C ++?

Nawaz
sumber
Penting untuk dicatat bahwa kekonstanan disebarkan ke anggota langsung saja. Jika struct Anda menahan pointer ke beberapa objek, pointer itu sendiri akan menjadi const (misalnya Anda tidak akan dapat menetapkannya kembali), tetapi Anda akan dapat mengubah objek yang dituju. (dengan asumsi struct Anda tidak memiliki pointer ke const)
Pablo Arias
-2

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

Untuk mendeklarasikan objek yang ditunjukkan oleh pointer sebagai const atau volatile, gunakan deklarasi dalam bentuk:

const char *cpch;
volatile char *vpch;

Untuk mendeklarasikan nilai pointer - yaitu, alamat sebenarnya yang disimpan di pointer - sebagai const atau volatile, gunakan deklarasi dalam bentuk:

char * const pchc;
char * volatile pchv;
Hampir Nyata
sumber
3
Bukan jawaban untuk pertanyaan
Jakob van Bethlehem