示例C代码演示了反汇编中的volatile?

时间:2012-11-03 07:38:17

标签: c volatile

什么是简短的说明性C程序,用于演示反汇编中易失性和非易失性之间的区别?

int main()
{
    volatile int x;

    ???
}

VS

int main()
{
    int x;

    ???
}

我们可以将???替换为生成的代码不同?

3 个答案:

答案 0 :(得分:7)

例如:

x = 0;

如果x不是volatile,编译器将看到它未被使用,并且可能会从生成的代码中完全消除它(x = 0;语句甚至变量本身)优化。

然而,volatile关键字完全是为了阻止编译器执行此操作。它基本上告诉代码生成器“无论你认为这个变量是什么/做什么,不要再猜测我,我需要它。“因此,编译器会将volatile变量视为已访问,并将发出与表达式对应的实际代码。

答案 1 :(得分:2)

这可能不是最短的例子,但它是嵌入式系统volatile的常见用法,假设x指向寄存器的地址,如果{{ 1}}未使用,编译器将假设volatile的值不会更改并将删除循环:

x

答案 2 :(得分:0)

你也可以试试这个:

x=1;
x=2;
return x;

启用优化并检查两者的反汇编。