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?)
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)
volatile
fungsi anggota hanya membuatthis
penunjuk mudah menguap, jadi anggota akan dibaca dari memori setiap kali mereka diakses tetapi tidak "secara resmi" mudah berubah.Jawaban:
Pertanyaan lain dapat ditanyakan (atau cara lain untuk melihat pertanyaan asli):
Apakah membuat struct
const
membuat semua anggotanyaconst
?Jika saya memiliki:
Akankah test.data
const
juga?Jawaban saya adalah: Ya. Jika Anda menyatakan objek tipe
whatever
denganconst
maka semua anggotanya akanconst
terlaluDemikian pula, jika Anda mendeklarasikan objek bertipe
whatever
withvolatile
maka semua anggotanya akan menjadivolatile
juga, seperti jika Anda mendeklarasikan objek denganconst
, semua anggotanya juga akan menjadiconst
.const
danvolatile
dua wajah dari mata uang yang sama; mereka sehingga Standar sering menyebutnya sebagaicv-qualifiers
.Mengutip dari Standar ($ 7.1.5.1 / 8)
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 ++?
sumber
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:
Untuk mendeklarasikan nilai pointer - yaitu, alamat sebenarnya yang disimpan di pointer - sebagai const atau volatile, gunakan deklarasi dalam bentuk:
sumber