[C / C ++易失变量,从另一个模块访问

问题描述 投票:3回答:2

我通常了解并理解易失性变量和优化的目的(嗯,我想是的!)。这个问题特别涉及到在声明变量的模块之外访问变量时会发生什么。

在以下情况下,如果在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) {}
}
c volatile
2个回答
1
投票

当从外部调用GetTheVar时,是否可以应用相同的优化,或者该函数调用确保每次循环迭代都始终读取sTheVar

可以应用相同的优化。例如,如果您使用的是LTO(链接时间优化),则编译器将了解有关GetTheVar的所有信息,并可能会确定funcThatWaits是一个无限循环(顺便说一下,它将是UB)。


0
投票

由于所有调用者都知道,要调用的函数可能取决于某种外生状态,因此不会优化函数调用,因为]

© www.soinside.com 2019 - 2024. All rights reserved.