c - 未使用的 volatile 变量

标签 c global-variables volatile

如果我将一个变量声明为 volatile 并且我没有在程序中的任何地方使用它,编译器会优化该变量吗?

在这种情况下,如果局部和全局声明 volatile 变量怎么办?

谢谢。

最佳答案

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

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

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


进一步的思考:

如果变量是static volatile并且在源代码中没有被引用,是否可以去掉?

答案是(几乎可以肯定)是的。源代码中没有对变量的引用,以可移植方式访问它的唯一方法需要引用它。可能的不可移植的黑客攻击包括定义多个这样的静态变量,并将对其中一个的引用传递给某个函数,然后该函数期望能够通过地址操作访问其他变量。然而,这样的代码充其量是令人毛骨悚然且不可移植的。这样的作者可能应该被带回某个地方,悄悄劝阻他不要再写这样的代码了。

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

关于c - 未使用的 volatile 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4933314/

相关文章:

java - 在 public void 中返回一个变量

java - 为什么 volatile 变量比普通同步更有效

c - 无法将完整脚本写入串行端口上的设备

c - 如何从我的 C 程序运行 bcdedit?

c++ - 在 C++ 中的头文件中声明全局结构

JavaScript如何将Fetch数据存储到全局变量

java - 从基于 Swing 的应用程序中的线程(ETC 除外)接收更新

c - 如果 volatile 对线程没有用,为什么原子操作需要指向 volatile 数据的指针?

c - 在 C 中返回指向 char 数组的指针

c - 最终关闭失败:file truncated