2012-09-14 36 views
1

我正在運行包含g ++的最新cygwin。沒有優化,C函數只調用一次

在我看來,一個函數調用正在被優化,即使編譯器標誌包含-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()每次都通過循環被調用。以下是編譯器輸出的摘錄,直接從標準輸出採取:

g++ -O0 -Wall -Wno-write-stings -Wextra 
+1

var1定義在哪裏? –

+0

'function_to_call'是否有返回的情況? –

+7

優化器與否,編譯器不能省略那個函數調用(好吧,不能忽略調用printf)。我懷疑你沒有顯示的一些代碼存在問題。 – Mat

回答

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中的全局變量傳遞)設置爲特定值時纔會生效。

0

你們這些人是正確的,我發佈了一個不完整的代碼示例。該函數實際上沒有任何返回語句,但我找到了罪魁禍首。 function_to_call()中的代碼位於狀態機中。發生的事情是,在代碼完成之前狀態已經改變,所以下一次通過它輸入了不同的情況。我向所有人道歉,並吸取教訓。我感謝你的努力。

+0

很高興您發現問題,謝謝您的更新! – amdn