我通常了解并理解易失性变量和优化的目的(嗯,我想是的!)。这个问题特别涉及到在声明变量的模块之外访问变量时会发生什么。
在以下情况下,如果在bar.c内部调用了funcThatWaits
,则可以对其进行优化,而不是在每次循环迭代时都获取sTheVar
的值。
但是,当从外部调用GetTheVar
时,是否可以应用相同的优化方法,或者该函数调用确保每次循环迭代都始终读取sTheVar
?
我并不是说这是好的代码或做法,而是出于问题的考虑而提出的例子。
bar.h
int GetTheVar(void);
bar.c
static /*volatile*/ int sTheVar;
int GetTheVar(void)
{
return sTheVar;
}
static void someISROrFuncCalledFromAnotherThread(void)
{
sTheVar = 1;
}
foo.c
#include "bar.h"
void funcThatWaits(void)
{
while(GetTheVar() != 1) {}
}
当从外部调用
GetTheVar
时,是否可以应用相同的优化,或者该函数调用确保每次循环迭代都始终读取sTheVar
?
可以应用相同的优化。例如,如果您使用的是LTO(链接时间优化),则编译器将了解有关GetTheVar
的所有信息,并可能会确定funcThatWaits
是一个无限循环(顺便说一下,它将是UB)。
由于所有调用者都知道,要调用的函数可能取决于某种外生状态,因此不会优化函数调用,因为]