ถ้าฉันมี:
struct whatever {
int data;
};
volatile whatever test;
จะtest.data
ผันผวนด้วย?
ถ้าฉันมี:
struct whatever {
int data;
};
volatile whatever test;
จะtest.data
ผันผวนด้วย?
คำตอบ:
สามารถถามคำถามอื่นได้ (หรืออีกวิธีในการดูคำถามเดิม):
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]
นั่นหมายความว่าถ้าออบเจ็กต์ของคุณเป็นอินสแตนซ์ของโครงสร้างคอมไพเลอร์จะไม่สามารถหลีกเลี่ยงการเพิ่มประสิทธิภาพเชิงรุกที่เกี่ยวข้องกับออบเจ็กต์ได้เว้นแต่จะหลีกเลี่ยงการเพิ่มประสิทธิภาพเชิงรุกของสมาชิกแต่ละคน (มิฉะนั้นจะหลีกเลี่ยงการเพิ่มประสิทธิภาพที่เกี่ยวข้องกับวัตถุได้อย่างไร)
หัวข้อที่เกี่ยวข้อง:
จาก: 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;
volatile
ฟังก์ชันสมาชิกทำให้this
ตัวชี้มีความผันผวนเท่านั้นดังนั้นสมาชิกจะถูกอ่านจากหน่วยความจำทุกครั้งที่มีการเข้าถึง แต่จะไม่ระเหย "อย่างเป็นทางการ"