我想知道volatile关键字与register、const和static关键词的不同用途。我不确定有什么影响,所以我认为:
register volatile int T=10;
建议编译器将T存储在寄存器中,并且可以从外部(操作系统、硬件、另一个线程(修改T的值
const volatile int T=10;
程序本身不能修改T,但T可以从代码之外的某个地方修改。
static volatile int T=10;
如果T是一个类的数据成员,这意味着该类的所有对象都具有相同的T值,并且T可以从外部修改。如果T是文件中的全局变量,则其他文件(属于项目的一部分(中的源代码无法访问T,但可以从外部访问T。如果T是函数中的局部变量,一旦初始化,它就会保留在内存中,直到程序结束,并且可以从外部进行修改。
我的想法正确吗?任何有经验的C++开发人员都能举一个例子,说明上面的内容可能在现实世界的应用程序中使用,或者非常罕见?
register volatile int T=10;
volatile
限定符表示编译器不能对T
应用优化或重新排序访问,而register
则向编译器提示T
将被大量使用。如果取T
的地址,则编译器会简单地忽略该提示。请注意,register
已弃用,但仍在使用。
实际用途:
我从来没有用过它,从来没有觉得有必要,现在真的想不出任何东西。
const volatile int T=10;
const
限定符表示T
不能通过代码进行修改。如果您尝试这样做,编译器将提供诊断。CCD_ 9的含义仍然与情况1中的含义相同。编译器无法优化或重新排序对T
的访问。
实际用途:
- 以只读模式访问共享内存
- 以只读模式访问硬件寄存器
static volatile int T=10;
static
存储限定符给出了T
静态存储持续时间(C++11§3.7(和内部链接,而volatile
仍然控制优化和重新排序。
实际用途:
- 与
volatile
相同,只是需要对象具有静态存储持续时间,并且不能从其他翻译单元访问