Nếu tôi có:
struct whatever {
int data;
};
volatile whatever test;
cũng sẽ test.datadễ bay hơi?
Nếu tôi có:
struct whatever {
int data;
};
volatile whatever test;
cũng sẽ test.datadễ bay hơi?
Câu trả lời:
Một câu hỏi khác có thể được đặt ra (hoặc đơn giản là một cách khác để xem xét câu hỏi ban đầu):
constcó tạo ra tất cả các thành viên của nó constkhông?Nếu tôi có:
struct whatever { int data; };
const whatever test;
Test.data constcũng vậy?
Câu trả lời của tôi là: Có. Nếu bạn khai báo một đối tượng kiểu whatevervới constsau đó tất cả các thành viên của nó sẽ là constquá
Tương tự, nếu bạn khai báo một đối tượng kiểu whatevervới volatilethì tất cả các thành viên của nó cũng sẽ như volatilevậy, giống như nếu bạn khai báo đối tượng với const, tất cả các thành viên của nó constcũng vậy.
constvà volatilelà hai mặt của cùng một đồng xu; chúng để Tiêu chuẩn thường gọi chúng là cv-qualifiers.
Trích dẫn từ Tiêu chuẩn ($ 7.1.5.1 / 8)
[Lưu ý: dễ bay hơi là một gợi ý cho việc triển khai để tránh tối ưu hóa tích cực liên quan đến đối tượng vì giá trị của đối tượng có thể bị thay đổi bằng cách mà một triển khai không thể phát hiện được. Xem 1.9 để biết ngữ nghĩa chi tiết. Nói chung, ngữ nghĩa của biến đổi được dự định là giống nhau trong C + + như trong C.]
Điều đó có nghĩa là, nếu đối tượng của bạn là một thể hiện của cấu trúc, thì trình biên dịch không thể tránh tối ưu hóa tích cực liên quan đến đối tượng , trừ khi nó tránh tối ưu hóa tích cực từng thành viên của nó. (Nếu không, làm cách nào khác nó có thể tránh tối ưu hóa liên quan đến đối tượng?)
Chủ đề có liên quan:
Từ: http://msdn.microsoft.com/en-us/library/145yc477%28v=vs.80%29.aspx
Để khai báo đối tượng được con trỏ trỏ tới là const hoặc biến động, hãy sử dụng khai báo có dạng:
const char *cpch;
volatile char *vpch;
Để khai báo giá trị của con trỏ - tức là địa chỉ thực được lưu trữ trong con trỏ - dưới dạng const hoặc biến động, hãy sử dụng khai báo có dạng:
char * const pchc;
char * volatile pchv;
volatilehàm thành viên chỉ làm chothiscon trỏ dễ bay hơi, vì vậy các thành viên sẽ được đọc từ bộ nhớ mỗi khi chúng được truy cập nhưng không phải là biến động "chính thức".