2011-02-24 64 views
4

什麼更有效?在循環之前或之內聲明數組

聲明數組例如字符緩衝區[4096]之前循環和在每次迭代通過strlcpy清除它的內容或聲明數組在循環內初始「」值?

char buffer[4096] = ""; 
while(sth) 
{ 
    strlcpy(buffer,"",sizeof(buffer)); 
    //some action; 
} 

VS

while(sth) 
{ 
    char buffer[4096] = ""; 
    //some action; 
} 
+0

*「什麼更有效?」* - 「有效」在哪方面? – 2011-02-24 21:43:46

+0

我不認爲 – 2011-02-24 21:44:16

回答

3

有可能兩者之間沒有顯著差異。唯一確定的方法是基準測試或查看編譯器生成的程序集。

第二個例子更清晰並且會是首選。

3

既沒有理由清除整個緩衝區,如果它只是用作字符串緩衝區。您只需確保將NUL字節\0附加到相關字符串的末尾。

如果您想要保證str *函數在buffer開始處開始,那麼上述原因只需要簡單的*buffer = '\0'即可。

1

在性能上的唯一可能不同的是分配到緩衝區,這將可能是你的編譯器轉換爲一個單獨的語句,這將是相同的:

*buffer = 0; 

編譯器將不執行任何堆棧管理當你進入循環。無論是在循環內部還是外部定義緩衝區都不會對堆棧產生任何影響。無論您在何處定義緩衝區變量(這並不意味着編譯器允許您訪問定義範圍之外的緩衝區),緩衝區的位置將保留在堆棧中。

即使上面顯示的單個賦值可能會被您的編譯器優化,如果它看到每次反覆重新初始化緩衝區都沒有意義。

0

我建議第一個版本。在第一個版本中,數組只分配一次。在第二個版本中,數組每循環迭代一次。

儘管編譯器可能會優化分配(例如只執行一次),但我認爲分解它會向讀者指出內存只分配一次。

這可能沒有什麼可擔心的,因爲許多平臺在堆棧上分配,並且分配包括更改堆棧指針的內容。

當有疑問輪廓。

當考慮優化時,不要。花時間讓程序正確和健壯。