[英]Can I get best performance making static variables?
為什么有些人這樣做:
char baa(int x) {
static char foo[] = " .. ";
return foo[x ..];
}
代替:
char baa(int x) {
char foo[] = " .. ";
return foo[x ..];
}
在linux源代碼應用程序上看起來很常見。 有性能差異? 如果有,有人可以解釋原因嗎? 提前致謝。
它本身不是性能,而是減少內存使用量。 有一個性能提升,但它不是(通常)的首要原因你會看到這樣的代碼。
函數中的變量在堆棧上分配,每次調用函數時都會保留和刪除它們,更重要的是,它們將計入堆棧大小限制,這是許多嵌入式和資源受限平台的嚴重限制。
但是,靜態變量存儲在.BSS
或.DATA
段中(非顯式初始化的靜態變量將轉到.BSS
,靜態初始化的靜態變量將轉到.DATA
),不在堆棧中。 編譯器還可以利用它來執行某些優化。
在典型的實現中,帶有static
的版本只會在編譯時將字符串放在內存中,而沒有static
的版本會使函數(每次調用它)在堆棧上分配一些空間並將字符串寫入該空間。
因此,帶static
的版本,
foo
更大的話可能會更大)。 是的,性能不同:與每次初始化的自動存儲中的變量不同,靜態變量只在初次執行該函數時初始化一次。 如果沒有寫入foo
,則沒有其他差異。 如果寫入,則靜態變量的更改在調用之間存活,而自動變量的更改在下次通過函數時會丟失。
在方法中定義變量static只意味着變量不是“釋放”的,即它將在后續調用中保持其值。 它可能會導致性能提高,具體取決於算法,但當然不是性能提升。
是的,如果您已將變量聲明為靜態,則會產生差異:
首先,內存將分配在bss或數據段中而不是堆棧中。
其次,它只會初始化一次,而不是每次都與其他函數變量不同,這肯定會產生差異。
第三,它保留了它的值b / w函數調用。所以根據你應該使用它的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.