c - 我怎么知道 gcc 是否同意某些东西是易变的?

标签 c gcc assembly volatile

考虑以下几点:

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/

相关文章:

c - #define 宏中定义的变量大小是多少?

c - 嵌套循环遍历数组

linux - Linux 上的 Masm32 : Why does mov [bx], ax 可以工作,但 mov [ax], bx (或 mov [bl], al)不行?

c++ - 尝试构建 muParser:错误:'std::basic_ostream 的显式实例化但没有可用的定义

C++ 汇编器输出——引用是如何实现的

c - strrev()的返回值有什么用?

c++ - ']' 标记之前的预期表达式? C

c - IPC 在 Unix 中使用优先级队列?

带有嵌入式 python 的 Python 扩展模块调用了错误的库

c - 如何找到不相关的未使用属性?