การทำให้โครงสร้างผันผวนทำให้สมาชิกทั้งหมดมีความผันผวนหรือไม่?


98

ถ้าฉันมี:

struct whatever {
int data;
};
volatile whatever test;
จะtest.dataผันผวนด้วย?


4
คำถามที่ยอดเยี่ยม ฉันอ่านว่าการมีvolatileฟังก์ชันสมาชิกทำให้thisตัวชี้มีความผันผวนเท่านั้นดังนั้นสมาชิกจะถูกอ่านจากหน่วยความจำทุกครั้งที่มีการเข้าถึง แต่จะไม่ระเหย "อย่างเป็นทางการ"
Alexandre C.

2
อาจจะซ้ำกันแต่ก็ยังเป็นคำถามที่ดี
Sergei Tachenov

คำตอบ:


124

สามารถถามคำถามอื่นได้ (หรืออีกวิธีในการดูคำถามเดิม):

การสร้างโครงสร้างconstทำให้สมาชิกทั้งหมดconstหรือไม่

ถ้าฉันมี:

struct whatever { int data; };

const whatever test;

test.data จะconstเกินไปหรือเปล่า

คำตอบของฉันคือใช่ หากคุณประกาศออบเจ็กต์ประเภทwhateverด้วยconstสมาชิกทั้งหมดก็จะเป็นconstเช่นกัน

ในทำนองเดียวกันถ้าคุณประกาศวัตถุประเภทwhateverด้วยvolatileสมาชิกทั้งหมดก็จะเป็นvolatileเช่นเดียวกันเช่นถ้าคุณประกาศวัตถุด้วยconstสมาชิกทั้งหมดก็จะเป็นconstเช่นกัน

constและvolatileเป็นสองหน้าของเหรียญเดียวกัน cv-qualifiersพวกเขากำลังเพื่อให้มาตรฐานมักจะหมายถึงพวกเขาเป็น


อ้างจากมาตรฐาน ($ 7.1.5.1 / 8)

[หมายเหตุ: การระเหยเป็นคำใบ้ในการนำไปใช้เพื่อหลีกเลี่ยงการเพิ่มประสิทธิภาพเชิงรุกที่เกี่ยวข้องกับออบเจ็กต์ เนื่องจากค่าของวัตถุอาจเปลี่ยนแปลงได้โดยการใช้งานที่ตรวจไม่พบ ดู 1.9 สำหรับความหมายโดยละเอียด โดยทั่วไปความหมายของการระเหยมีจุดมุ่งหมายให้เหมือนกันใน C + + ตามที่อยู่ใน C]

นั่นหมายความว่าถ้าออบเจ็กต์ของคุณเป็นอินสแตนซ์ของโครงสร้างคอมไพเลอร์จะไม่สามารถหลีกเลี่ยงการเพิ่มประสิทธิภาพเชิงรุกที่เกี่ยวข้องกับออบเจ็กต์ได้เว้นแต่จะหลีกเลี่ยงการเพิ่มประสิทธิภาพเชิงรุกของสมาชิกแต่ละคน (มิฉะนั้นจะหลีกเลี่ยงการเพิ่มประสิทธิภาพที่เกี่ยวข้องกับวัตถุได้อย่างไร)


หัวข้อที่เกี่ยวข้อง:

เหตุใดเราจึงใช้คำสำคัญที่มีความผันผวนใน C ++


สิ่งสำคัญคือต้องทราบว่า constness จะแพร่กระจายไปยัง memembers ในทันทีเท่านั้น หากโครงสร้างของคุณมีตัวชี้ไปที่วัตถุบางอย่างตัวชี้จะเป็น const (เช่นคุณจะไม่สามารถกำหนดใหม่ได้) แต่คุณจะสามารถเปลี่ยนวัตถุที่ชี้ไปที่ (สมมติว่าโครงสร้างของคุณไม่ได้ลากตัวชี้ไปที่ const)
Pablo Arias

-2

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

ในการประกาศวัตถุที่ชี้โดยตัวชี้เป็น const หรือ volatile ให้ใช้การประกาศแบบฟอร์ม:

const char *cpch;
volatile char *vpch;

ในการประกาศค่าของตัวชี้ - นั่นคือที่อยู่จริงที่จัดเก็บในตัวชี้ - เป็น const หรือ volatile ให้ใช้การประกาศแบบฟอร์ม:

char * const pchc;
char * volatile pchv;

4
ไม่ใช่คำตอบสำหรับคำถาม
Jakob van Bethlehem
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.