Việc tạo cấu trúc dễ bay hơi có làm cho tất cả các thành viên của nó dễ bay hơi không?


96

Nếu tôi có:

struct whatever {
int data;
};
volatile whatever test;
cũng sẽ test.datadễ bay hơi?


4
Câu hỏi hay. Tôi đọc rằng có một volatilehàm thành viên chỉ làm cho thiscon 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".
Alexandre C.

2
Có thể là một bản sao , nhưng vẫn là một câu hỏi hay.
Sergei Tachenov

Câu trả lời:


119

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):

Việc tạo cấu trúc 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.

constvolatilelà 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ượnggiá 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ại sao chúng ta sử dụng từ khóa dễ bay hơi trong C ++?


Điều quan trọng cần lưu ý là hằng số chỉ được truyền cho các thành viên tức thì. Nếu cấu trúc của bạn giữ một con trỏ tới một đối tượng nào đó, thì bản thân con trỏ sẽ là const (ví dụ: bạn sẽ không thể gán lại nó), nhưng bạn sẽ có thể thay đổi đối tượng được trỏ vào. (giả sử struct của bạn không hoding một con trỏ đến const)
Pablo Arias

-2

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;

3
Không phải là câu trả lời cho câu hỏi
Jakob van Bethlehem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.