未使用的volatile变量

Lak*_*man 2 c global-variables volatile

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

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

TQ.

Jon*_*ler 6

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

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

volatile限定符对照(影响)编译器如何生成访问变量的代码-如果代码不访问变量,就没有必要改变其产生除了以避免产生对变量的引用的代码.它可能也不存在.


进一步思考:

如果static volatile源代码中的变量是和未引用的,它可以被消除吗?

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

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

  • 我想知道编译器如何做到这一点.它一次只编译一个单元,如果变量未声明为静态,则无法知道它是否在其他地方使用过.这看起来更像是链接器的工作. (3认同)