volatile 不会阻止变量被优化
Volatile is not preventing a variable from being optimized
据我所知,"volatile" 关键字用于防止编译器优化未使用的变量。我正在使用 STM32 开发板,我声明并初始化了一个变量,如下所示;
volatile uint32_t errorCallbackCounter = 24 ;
永远不再使用它。
调试时,没有看到这个变量。我正在用 STMStudio(实时变量观察器)检查它,当我想导入变量时,errorCallbackCounter
的地址被视为 0x0.
但是当我在任何地方使用它时,它就变得可见了。
所以 volatile 关键字没有发挥作用,或者 - 更有可能 - 我知道它有问题。
提前致谢。
volatile
表示每次访问该变量时,系统都会从内存中加载该变量。
不允许编译器将数据直接存入寄存器。
The volatile keyword prevents the compiler from performing optimization on code involving volatile objects, thus ensuring that each volatile variable assignment and read has a corresponding memory access. Without the volatile keyword, the compiler knows a variable does not need to be reread from memory at each use, because there should not be any writes to its memory location from any other thread or process.
链接器可以删除从未使用过的变量
volatile
关键字影响访问变量的代码,防止 access 被编译器重新排列或删除。上面的行是一个带有初始值设定项的变量 definition,它不算作访问,它在 main()
开始之前被安排。但是如果它没有被accessible程序代码引用,根本就没有accessed,链接器认为删除它是安全的,不有人会注意到。
但是您可以将变量标记为 "it's needed no matter what" 和
__attribute__((used))
放在定义的末尾。这适用于 gcc
,其他编译器可能有另一个指令。还有一个我现在想不起来的链接器选项,用于在可执行文件中包含所有未使用的数据部分。
据我所知,"volatile" 关键字用于防止编译器优化未使用的变量。我正在使用 STM32 开发板,我声明并初始化了一个变量,如下所示;
volatile uint32_t errorCallbackCounter = 24 ;
永远不再使用它。
调试时,没有看到这个变量。我正在用 STMStudio(实时变量观察器)检查它,当我想导入变量时,errorCallbackCounter
的地址被视为 0x0.
但是当我在任何地方使用它时,它就变得可见了。
所以 volatile 关键字没有发挥作用,或者 - 更有可能 - 我知道它有问题。
提前致谢。
volatile
表示每次访问该变量时,系统都会从内存中加载该变量。
不允许编译器将数据直接存入寄存器。
The volatile keyword prevents the compiler from performing optimization on code involving volatile objects, thus ensuring that each volatile variable assignment and read has a corresponding memory access. Without the volatile keyword, the compiler knows a variable does not need to be reread from memory at each use, because there should not be any writes to its memory location from any other thread or process.
链接器可以删除从未使用过的变量
volatile
关键字影响访问变量的代码,防止 access 被编译器重新排列或删除。上面的行是一个带有初始值设定项的变量 definition,它不算作访问,它在 main()
开始之前被安排。但是如果它没有被accessible程序代码引用,根本就没有accessed,链接器认为删除它是安全的,不有人会注意到。
但是您可以将变量标记为 "it's needed no matter what" 和
__attribute__((used))
放在定义的末尾。这适用于 gcc
,其他编译器可能有另一个指令。还有一个我现在想不起来的链接器选项,用于在可执行文件中包含所有未使用的数据部分。