Một con trỏ có dạng
volatile int* p;
là một con trỏ đến một int
rằng trình biên dịch sẽ coi như volatile
. Điều này có nghĩa rằng trình biên dịch sẽ giả định rằng có thể cho biến mà p
trỏ vào đã thay đổi ngay cả khi không có gì trong mã nguồn để gợi ý rằng điều này có thể xảy ra. Ví dụ, nếu tôi đặt p
để trỏ đến một số nguyên thông thường, sau đó mỗi khi tôi đọc hoặc viết *p
trình biên dịch nhận thức được rằng giá trị có thể đã thay đổi bất ngờ.
Có một trường hợp sử dụng khác cho số volatile int*
: Nếu bạn khai báo int
là volatile
, thì bạn không nên chỉ định trường hợp này với số int*
thông thường. Ví dụ, đây là một ý tưởng tồi:
volatile int myVolatileInt;
int* ptr = &myVolatileInt; // Bad idea!
Lý do cho điều này là trình biên dịch C không còn nhớ rằng biến chỉ vào bởi ptr
là volatile
, vì vậy nó có thể bộ nhớ cache giá trị của *p
trong một thanh ghi không đúng cách . Trong thực tế, trong C++, mã trên là một lỗi. Thay vào đó, bạn nên viết
volatile int myVolatileInt;
volatile int* ptr = &myVolatileInt; // Much better!
Bây giờ, trình biên dịch nhớ rằng ptr
điểm tại một volatile int
, vì vậy nó sẽ không (hay không!) Nên cố gắng tối ưu hóa truy cập thông qua *ptr
.
Một chi tiết cuối cùng - con trỏ bạn đã thảo luận là con trỏ đến volatile int
. Bạn cũng có thể làm điều này:
int* volatile ptr;
này nói rằng con trỏ tự là volatile
, có nghĩa là trình biên dịch không nên cố gắng để cache con trỏ trong bộ nhớ hoặc cố gắng tối ưu hóa giá trị con trỏ vì con trỏ bản thân có thể được bố trí bởi cái gì khác (phần cứng, một chủ đề, vv) bạn có thể kết hợp này lại với nhau nếu bạn muốn để có được con thú này:
volatile int* volatile ptr;
này nói rằng cả hai con trỏ và pointee có thể bị thay đổi bất ngờ . Trình biên dịch không thể tối ưu hóa con trỏ chính nó, và nó không thể tối ưu hóa những gì đang được chỉ ra.
Hy vọng điều này sẽ hữu ích!
Tôi nghĩ rằng bạn có nghĩa là "bạn KHÔNG nên chỉ vào nó với một int thường xuyên *" – markgz
@ markgz- Rất tiếc! Vâng đúng rồi. Đã sửa. – templatetypedef
Tôi nghĩ rằng đó là một lỗi trong C là tốt, nhưng trình biên dịch C ít dễ bị phàn nàn về loại không phù hợp. –