2014-05-01 13 views
0
int a[5] = {0}; 

VS用C初始化數組 - 執行時間

typedef struct 
{ 
int a[5]; 
} ArrStruct; 
ArrStruct arrStruct; 
sizeA = sizeof(arrStruct.a)/sizeof(int); 
for (it = 0 ; it < sizeA ; ++it) 
    arrStruct.a[it] = 0; 

是否用於環路初始化通過花費更多的執行時間?如果是這樣,爲什麼?

+1

'int [5]'只有20個字節,你爲什麼要關心? –

+0

它用於學術目的... –

回答

2

它取決於編譯器和優化標誌。

在最近的海灣合作委員會(如4.8或4.9)與gcc -O3(或者甚至可能-O1-O2)它不應該的問題,因爲相同的代碼將被髮射(GCC更是把這將改變你的循環變成builtin_memset優化其會進一步優化)。

在某些編譯器上,可能發生int a[5] = {0};可能會更快,因爲編譯器可能會發出例如向量指令(或在x86 a rep stosw)清除數組。

最好的辦法是檢查生成的(gimple representation和assembler)代碼(例如使用gcc -fdump-tree-gimple -O3 -fverbose-asm -mtune=native -S)並進行基準測試。大部分情況並不重要。編譯時一定要啓用優化。

一般來說,不關心這樣的微觀優化;一個好的優化編譯器比你有時間編碼要好。

+1

Clang在'-O3'下產生完全相同的彙編輸出。 – Kevin

+0

是否有任何意義的事實,在for循環中,我們每次都有一個計算(it

+1

@KobiBurnley沒有優化,是的。編譯器每循環檢查一次值 – Kevin

1

它取決於變量的範圍。對於靜態或全局變量,可以在編譯時完成第一次初始化,而循環運行在運行時,運行時。因此,沒有與前者相關的「執行」。

您可能會對this question(特別是this answer)的討論感興趣。

+0

我假設你指的是一個聰明的編譯器會將該全局靜態數組放入'.bss'段中,在程序執行之前將其置零。但實際的調零不是「在編譯時」。編譯器只是在目標文件中說:「給我這麼多的內存」,這是_OS的責任,實際上將它歸零。並不真正影響答案,但我認爲值得考慮出於興趣。 – Brendan

+0

@布倫丹 - 是的,這就是我正在談論的。在我所包含的鏈接中進行了更廣泛的討論。 – Floris