未使用的volatile变量

时间:2011-02-08 13:00:32

标签: c global-variables volatile

如果我将变量声明为volatile,如果我不在程序中的任何位置使用它,编译器会优化该变量吗?

在这种情况下,对于volatile变量的局部和全局声明是什么情况?

TQ

3 个答案:

答案 0 :(得分:6)

编译器可以并且可能会消除(忽略)未使用的volatile变量声明(但编译器无法消除未使用的全局变量定义 - 它必须假设某些其他转换单元(TU)将引用它)。

如果变量是函数的本地变量并且未使用,则编译器可以消除该变量,无论其是否存在波动性。目前尚不清楚你是否可以拥有有意义的局部volatile变量,但我想你可以调用一个函数将其地址传递给某些代码,然后安排一个中断处理程序写入该变量 - 实现波动(但显然,使用过的变量。)

volatile限定符控制(影响)编译器如何生成访问变量的代码 - 如果代码不访问变量,则不需要更改它生成的代码,除非生成对变量的引用。它可能也不存在。


进一步的想法:

如果源代码中的变量为static volatile且未引用,是否可以将其删除?

答案是(几乎肯定)是的。源中没有对变量的引用,并且只能以可移植的方式访问它,因此需要引用它。可能的不可移植的黑客将包括定义多个这样的静态变量,并将对其中一个的引用传递给某个函数,然后该函数希望能够通过地址操作访问其他变量。但是,这样的代码充其量是可怕的和不可移植的。这样的作者应该可以在某个地方被取出并且悄悄地再次编写这样的代码。

因此,无法消除全局变量定义;它可能会从另一个TU引用。可以消除未使用的静态变量定义。可以消除未使用的局部变量定义。这适用于所讨论的变量是否具有volatile限定符。

答案 1 :(得分:3)

volatile与存储分配无关 - 如果编译器在没有volatile关键字的情况下消除了未使用的变量,它可以并且可能会使用volatile关键字将其消除。如果您想确切知道,请检查生成的代码或符号表。

答案 2 :(得分:-1)

如果没有使用变量,那么这是最佳情况。优化仅在操作和计算的情况下进行。

如果未对数据执行任何操作,则无需进行优化。