没有优化,C函数只调用一次

时间:2012-09-14 16:09:04

标签: c optimization g++

我正在使用包含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

2 个答案:

答案 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()中的代码位于状态机中。发生的事情是在该代码完成之前状态已经改变,因此下一次通过它进入了一个不同的情况。我向所有人道歉,并吸取教训。我感谢您的努力。