如果我将变量声明为volatile并且如果我不在程序中的任何位置使用它,编译器会优化该变量吗?
在这种情况下,对于volatile变量的局部和全局声明是什么情况?
TQ.
鉴于这些定义:
\ntypedef void foo_t(void);\nstatic void foo(void) {\n}\nRun Code Online (Sandbox Code Playgroud)\n正如预期的那样,以下内容没有得到优化:读取指针并间接(尾部)调用函数:
\nfoo_t volatile *gfoo = foo;\nvoid gtest() {\n gfoo();\n}\nRun Code Online (Sandbox Code Playgroud)\n但是,如果声明了指针static,则读取和函数调用将得到完全优化:
static foo_t volatile *sfoo = foo;\nvoid stest() {\n sfoo();\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我意识到,由于static定义的原因,编译器可以看到它sfoo从未被写入,因此它希望假设它总是指向同一个空函数,只要有机会它就会内联。然而,我的理解volatile是它应该强制读取访问而不是对读取的数据进行任何假设。
例如,在N1256(最终的 C99 草案\xe2\x80\x9c6.7.3 类型限定符\xe2\x80\x9d)中,规定:
\n\n\n具有 volatile 限定类型的对象可能会以实现未知的方式进行修改,或者产生其他未知的副作用。因此,引用此类对象的任何表达式都应严格根据抽象机的规则进行评估,如 5.1.2.3 中所述。[\xe2\x80\xa6]
\n
相关问题什么时候可以完全优化掉易失性变量?它的答案引用了同一段,但由于所讨论的变量被读取而不仅仅是初始化,我认为它同意sfoo不应该被优化掉。
如果重要的话,我在这篇德国博客文章中读到了有关 openssl 尝试使用此方法来防止优化死存储的方式的内容。
\n