相关疑难解决方法(0)

为什么C需要挥发性?

为什么volatileC需要?它是干什么用的?它会做什么?

c declaration volatile

396
推荐指数
15
解决办法
27万
查看次数

未使用的volatile变量

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

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

TQ.

c global-variables volatile

2
推荐指数
1
解决办法
1359
查看次数

为什么 gcc 和 clang 可以优化对静态 volatile 变量的读取?

鉴于这些定义:

\n
typedef void foo_t(void);\nstatic void foo(void) {\n}\n
Run Code Online (Sandbox Code Playgroud)\n

正如预期的那样,以下内容没有得到优化:读取指针并间接(尾部)调用函数:

\n
foo_t volatile *gfoo = foo;\nvoid gtest() {\n    gfoo();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是,如果声明了指针static,则读取和函数调用将得到完全优化:

\n
static foo_t volatile *sfoo = foo;\nvoid stest() {\n    sfoo();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Godbolt 上的两个例子

\n

我意识到,由于static定义的原因,编译器可以看到它sfoo从未被写入,因此它希望假设它总是指向同一个空函数,只要有机会它就会内联。然而,我的理解volatile是它应该强制读取访问而不是对读取的数据进行任何假设。

\n

例如,在N1256(最终的 C99 草案\xe2\x80\x9c6.7.3 类型限定符\xe2\x80\x9d)中,规定:

\n
\n

具有 volatile 限定类型的对象可能会以实现未知的方式进行修改,或者产生其他未知的副作用。因此,引用此类对象的任何表达式都应严格根据抽象机的规则进行评估,如 5.1.2.3 中所述。[\xe2\x80\xa6]

\n
\n

相关问题什么时候可以完全优化掉易失性变量?它的答案引用了同一段,但由于所讨论的变量被读取而不仅仅是初始化,我认为它同意sfoo不应该被优化掉。

\n

如果重要的话,我在这篇德国博客文章中读到了有关 openssl 尝试使用此方法来防止优化死存储的方式的内容。

\n

c

1
推荐指数
1
解决办法
94
查看次数

标签 统计

c ×3

volatile ×2

declaration ×1

global-variables ×1