我想知道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
无法通过代码进行修改。如果尝试这样做,编译器将提供诊断信息。 volatile
的含义仍然与情况1相同。编译器无法优化或重新排序对T
的访问。
实用用法:
static volatile int T=10;
[
static
存储限定符给出T
静态存储持续时间(C ++ 11§3.7)和internal linkage,而volatile
仍控制优化和重新排序。
实用用法:
volatile
相同,不同之处在于您需要对象具有静态存储期限,并且无法从其他翻译单元访问。