如果我将一个变量声明为 volatile 并且我没有在程序中的任何地方使用它,编译器会优化该变量吗?
在这种情况下,如果局部和全局声明 volatile 变量怎么办?
谢谢。
最佳答案
编译器可以并且很可能会消除(忽略)未使用的 volatile
变量声明(但编译器无法消除未使用的全局变量定义 - 它必须假设其他一些翻译单元(TU ) 将引用它)。
如果变量是函数的局部变量且未使用,编译器可以将其删除,而不管其易变性。目前尚不清楚你是否可以拥有有意义的局部 volatile 变量,但我想你可以调用一个函数,将其地址传递给一些代码,然后安排中断处理程序写入该变量 - 实现易变性(但很明显,一个使用过的变量)。
volatile
限定符控制(影响)编译器如何生成访问变量的代码 - 如果代码不访问变量,则无需更改它生成的代码,除非避免生成对变量的引用。它也可能不存在。
进一步的思考:
如果变量是static volatile
并且在源代码中没有被引用,是否可以去掉?
答案是(几乎可以肯定)是的。源代码中没有对变量的引用,以可移植方式访问它的唯一方法需要引用它。可能的不可移植的黑客攻击包括定义多个这样的静态变量,并将对其中一个的引用传递给某个函数,然后该函数期望能够通过地址操作访问其他变量。然而,这样的代码充其量是令人毛骨悚然且不可移植的。这样的作者可能应该被带回某个地方,悄悄劝阻他不要再写这样的代码了。
所以,一个全局变量定义是不能去掉的;它可能是从另一个 TU 引用的。可以删除未使用的静态变量定义。可以删除未使用的局部变量定义。这适用于所讨论的变量是否具有 volatile
限定符。
关于c - 未使用的 volatile 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4933314/