2016-11-07 74 views
1

當我在函數頂部定義變量並稍後聲明變量時,生成的代碼有什麼區別?例如:在函數頂部聲明的變量和稍後聲明的變量之間的區別

int f(int parameter) { 
int a = parameter * 2; 
if (a == 4) 
    return 1; 
int b = parameter * 4; 
if (b == 4) 
    return 2; 
return 0; 
} 

是否輸出代碼具有if (a == 4)b變量初始化和分配或將ab變量在同一時刻被初始化?

+1

沒有區別。檢查拆卸並查看。順便說一句,你的代碼中的變量都不是「靜態」的。 –

+3

「在函數之上」也在函數內部。 – plasmacel

+1

我剛剛將標題中的「靜態」編輯出來。 – glglgl

回答

7

要看實際上發生了什麼,看看生成的彙編程序。

在分配空間方面,大多數編譯器將在函數啓動時爲函數中使用的所有變量在堆棧上分配足夠的空間。 (這不發生這樣的,但我不知道是哪個不喜歡這個工作,任何編譯器。)

在初始化方面,抽象機(由定義C和C++標準)將初始化(即設置初始值)視爲在不同時間發生。 ba與4進行比較後被初始化。當然,按照as-if規則,如果初始化沒有副作用,編譯器可以按照它認爲合適的方式移動初始化輪。這比C++更經常發生,因爲C++初始化器通常涉及其他翻譯單元中的構造函數,並且編譯器無法查看是否存在副作用。

在這種簡單的情況下,如果您優化,很可能ab將永遠只存儲在一個寄存器中,這可能是相同的寄存器。 (這是因爲您使用的是原始int變量,並且因爲您不重疊使用ab。)