2012-05-09 55 views
10

爲什麼有些人做的事:而不是我可以通過靜態變量獲得最佳性能嗎?

char baa(int x) { 
    static char foo[] = " .. "; 
    return foo[x ..]; 
} 

char baa(int x) { 
    char foo[] = " .. "; 
    return foo[x ..]; 
} 

看起來像Linux的源代碼的應用非常普遍。有性能差異?如果是,有人可以解釋爲什麼?提前致謝。

+1

這段代碼沒有編譯,數組指示符應該在變量名後面,而不是在它之前。 –

回答

9

這不是性能本身,而是減少內存使用量。有性能提升,但它不(通常)是你會看到這樣的代碼的主要原因。在功能

變量是在棧上分配的,他們會被保留,並且每個函數被調用時刪除,重要的是,他們將朝着堆大小限制是許多嚴重製約嵌入式和資源 - 計數受限制的平臺。

但是,靜態變量存儲在任一.BSS.DATA段(非明確地初始化靜態變量將去.BSS,靜態初始化靜態變量將去.DATA),從堆棧中。編譯器也可以利用它來執行某些優化。

3

是的,性能不同:與自動存儲中每次初始化的變量不同,靜態變量僅在您第一次執行函數時才初始化一次。如果foo而不是寫入,則沒有其他差異。如果寫入,則靜態變量的更改在兩次調用之間存在,而對自動變量的更改在下次通過函數時丟失。

2

在一個方法中定義一個變量static只意味着該變量不是「釋放」的,即它將在隨後的調用中保持它的值。 這可能會導致性能改進取決於算法,但它本身並不是一個性能改進。

3

在典型的實現,該版本與static將只是把字符串某處內存在編譯的時候,而沒有static版本將會使函數(每次被稱爲時間)在棧上分配一些空間,寫串入那個空間。

static版本,因此,

  • 很可能是更快
  • 可使用較少的內存
  • 將使用較少的堆棧空間(其在一些系統是一種稀缺資源)
  • 將會在緩存中發揮更好的效果(這對於小字符串來說不太可能是個大問題,但如果foo更大)。
+1

你的意思是前者,而不是後者。 –

+0

爲什麼是,所以我做到了。謝謝。我編輯我的答案是(1)更清楚,(2)正確。 –

+0

它爲什麼會節省內存?加載函數時是否還需要花費堆棧內存? – dragonxlwang

1

是它使差,如果u已經聲明爲靜態變量:

  1. 首先,存儲器將在任一BSS或數據段,而不是堆疊進行分配。其次,它將被初始化一次,而不是每次都不像其他變量 函數那樣,這肯定會產生差異。

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

相關問題