爲什麼有些人做的事:而不是我可以通過靜態變量獲得最佳性能嗎?
char baa(int x) {
static char foo[] = " .. ";
return foo[x ..];
}
:
char baa(int x) {
char foo[] = " .. ";
return foo[x ..];
}
看起來像Linux的源代碼的應用非常普遍。有性能差異?如果是,有人可以解釋爲什麼?提前致謝。
爲什麼有些人做的事:而不是我可以通過靜態變量獲得最佳性能嗎?
char baa(int x) {
static char foo[] = " .. ";
return foo[x ..];
}
:
char baa(int x) {
char foo[] = " .. ";
return foo[x ..];
}
看起來像Linux的源代碼的應用非常普遍。有性能差異?如果是,有人可以解釋爲什麼?提前致謝。
這不是性能本身,而是減少內存使用量。有是性能提升,但它不(通常)是你會看到這樣的代碼的主要原因。在功能
變量是在棧上分配的,他們會被保留,並且每個函數被調用時刪除,重要的是,他們將朝着堆大小限制是許多嚴重製約嵌入式和資源 - 計數受限制的平臺。
但是,靜態變量存儲在任一.BSS
或.DATA
段(非明確地初始化靜態變量將去.BSS
,靜態初始化靜態變量將去.DATA
),從堆棧中。編譯器也可以利用它來執行某些優化。
是的,性能不同:與自動存儲中每次初始化的變量不同,靜態變量僅在您第一次執行函數時才初始化一次。如果foo
是而不是寫入,則沒有其他差異。如果寫入,則靜態變量的更改在兩次調用之間存在,而對自動變量的更改在下次通過函數時丟失。
在一個方法中定義一個變量static只意味着該變量不是「釋放」的,即它將在隨後的調用中保持它的值。 這可能會導致性能改進取決於算法,但它本身並不是一個性能改進。
在典型的實現,該版本與static
將只是把字符串某處內存在編譯的時候,而沒有static
版本將會使函數(每次被稱爲時間)在棧上分配一些空間,寫串入那個空間。
與static
版本,因此,
foo
更大)。你的意思是前者,而不是後者。 –
爲什麼是,所以我做到了。謝謝。我編輯我的答案是(1)更清楚,(2)正確。 –
它爲什麼會節省內存?加載函數時是否還需要花費堆棧內存? – dragonxlwang
是它使差,如果u已經聲明爲靜態變量:
首先,存儲器將在任一BSS或數據段,而不是堆疊進行分配。其次,它將被初始化一次,而不是每次都不像其他變量 函數那樣,這肯定會產生差異。
第三,它保留了它的b/w函數調用值。所以根據情況你應該使用 。
這段代碼沒有編譯,數組指示符應該在變量名後面,而不是在它之前。 –