我正在使用包含g ++的最新cygwin。
在我看来,即使编译器标志包含-O0,也正在优化函数调用。
从该循环调用该函数(示例中简化了所有代码):
void my_func ( void )
{
for ( int i = 0; i < 2; i++) {
var1 = table[i];
printf("i = %d\n", i);
function_to_call();
printf("Called the function\n");
}
}
它调用的函数如下:
void function_to_call()
{
int internal_var = var1;
// do some math using internal_var, passing the result
// as an input to another function
printf("var1: %d\n", internal_var);
}
运行它,输出将是:
i = 0
var1 = 0
Called the function
i = 1
Called the function
为什么会这样?我希望每次循环都调用function_to_call()。以下是编译器输出的摘录,直接来自stdout:
g++ -O0 -Wall -Wno-write-stings -Wextra
答案 0 :(得分:1)
首先,您发布的内容仅是图片的“部分”,因为function_to_call()
输出var1: ...
,而您的示例输出为var1 = ...
。不过,如果我不得不抓住这个问题......
void function_to_call()
{
int internal_var = var1;
// do some math using internal_var, passing the result
// as an input to another function
printf("var1: %d\n", internal_var);
}
我猜想“做一些数学......”部分正在迫使早日回归;但是,仅当输入(可能作为var1
中的全局变量传递)设置为特定值时。
答案 1 :(得分:0)
你们大家都说我发布了一个不完整的代码示例。该函数实际上没有任何返回语句,但我找到了罪魁祸首。 function_to_call()中的代码位于状态机中。发生的事情是在该代码完成之前状态已经改变,因此下一次通过它进入了一个不同的情况。我向所有人道歉,并吸取教训。我感谢您的努力。