考虑以下几点:
volatile uint32_t i;
我如何知道 gcc 是否将 i 视为 volatile?它会被这样声明,因为没有附近的代码会修改它,并且它的修改可能是由于某些中断。
我不是世界上最差的汇编程序员,但我在电视上玩过一个。有人可以帮助我了解它有何不同吗?
如果你采用以下愚蠢的代码:
#include <stdio.h>
#include <inttypes.h>
volatile uint32_t i;
int main(void)
{
if (i == 64738)
return 0;
else
return 1;
}
将其编译为对象格式并通过objdump反汇编,然后在删除'volatile'后进行同样的操作,没有区别(根据diff)。 volatile 声明是否太靠近其检查或修改的位置,或者我是否应该在声明 volatile 时始终使用某种原子类型?一些优化标志会影响这一点吗?
请注意,我的愚蠢样本并不完全符合我的问题,我意识到这一点。我只是想知道 gcc 是否将变量视为易变的,所以我正在研究小型转储以试图找出差异。
最佳答案
在某些情况下,许多编译器没有按照应有的方式处理 volatile。如果您经常处理 volatile 以避免令人讨厌的意外,请参阅本文:Volatiles are Miscompiled, and What to Do about It .它还包含对标准引文支持的 volatile 的非常好的描述。
要 100% 确定,对于这样一个简单的示例,请检查程序集输出。
关于c - 我怎么知道 gcc 是否同意某些东西是易变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/642568/