簡體   English   中英

我可以獲得最佳性能制作靜態變量嗎?

[英]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只意味着變量不是“釋放”的,即它將在后續調用中保持其值。 它可能會導致性能提高,具體取決於算法,但當然不是性能提升。

是的,如果您已將變量聲明為靜態,則會產生差異:

  1. 首先,內存將分配在bss或數據段中而不是堆棧中。

  2. 其次,它只會初始化一次,而不是每次都與其他函數變量不同,這肯定會產生差異。

  3. 第三,它保留了它的值b / w函數調用。所以根據你應該使用它的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM