我什么时候会在C++中使用const volatile、register volatible和static volati
When would I use const volatile, register volatile, static volatile in C++?
我想知道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
相同,只是需要对象具有静态存储持续时间,并且不能从其他翻译单元访问
相关文章:
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在一个读写器队列中,我可以用volatile替换原子吗
- GCC 8 无法编译make_shared<volatile int>()
- 不能使这种类型的"void(C::* volatile)(int) const "在参考手册C++示
- 如何使用"asm volatile"编写 btr 指令
- 未能优化看似明显的循环不变量(但volatile限定符发挥了神奇的作用)
- 读取互斥对象范围之外的volatile变量,而不是std::atomic
- 你能从"volatile const char*"构造一个字符串吗?(不使用`const_cast`
- volatile, std::sig_atomic_t, and atomic_signal_fence
- 为什么std::atomic中的所有成员函数都同时出现在有volatile和没有volatile的情况下
- 了解C++中的'volatile'关键字
- 注册 Clang 检查器时出错:"out-of-line-definition of register"
- 错误 C2678:二进制"+":未找到采用类型 'volatile A' 的左侧操作数的运算符(或者没有可接受的转换)
- Xcode - 如何使用"-fexhaustive-register-search"进行编译 - 链接器崩溃需要
- 为什么GCC在将未初始化的volatile指针强制转换为"void"时发出警告
- reinterpret_cast<volatile uint8_t*>(37)"不是常量表达式
- C++"Register a class"是什么
- C++:为什么volatile访问需要排序
- C++合成的move构造函数如何受到volatile和虚拟成员的影响
- 我什么时候会在C++中使用const volatile、register volatible和static volati