2013-01-23 21 views
0

我總是忘記將「靜態」前綴添加到我的變量和函數中,因此GCC將它們標記爲extern。是否可以更改此行爲,以便默認情況下將所有內容標記爲靜態。這兩種類型在運行時是否存在性能差異,還是更形式化?將默認值從Extern更改爲靜態

+0

您可能需要從編譯後的代碼中轉儲符號,以查看是否有任何您已經忘記的靜態代碼。試試'nm','objdump'和其他類似的工具。 –

回答

5

是否可以更改此行爲,以便默認情況下將所有內容標記爲靜態。

不是我所知。

這兩種類型在運行時是否存在性能差異,還是更形式化?

是的,gcc能夠在指定對象或函數爲static時執行進一步的優化。例如,gcc(即使在-O0中)將內聯一個只被調用一次的指定函數static

+0

你知道GCC是否會檢測到其他文件中沒有使用變量,並在編譯時將它威脅爲靜態?或者我總是需要明確地添加它? – Muis

+0

@Joshua它不會。或者至少不是默認的。較新的'gcc'版本具有鏈接時間優化:請參閱'gcc'選項'-flto'和'-fwhole-program'。 – ouah

1

首先:extern修飾符是不是默認。該限定符表示提到的項目將在另一個編譯單元中定義,因此它僅適用於聲明全局變量之類的內容。

沒有辦法使static修飾符成爲默認值,因爲沒有dynamic修飾符可以取消這個默認值。因此,沒有辦法用適當的默認值編寫工作代碼:每個函數和變量都是static,這會導致編譯器生成一個空的輸出文件!

這兩種類型在運行時是否存在性能差異,還是更形式化?

編譯器可以對static函數和變量執行一些優化,而這些函數和變量不能在動態函數上執行。特別是,從未引用的函數和變量可能會完全丟棄,並且static函數可以更積極地內聯。

+0

如果extern不是默認的,那麼默認是什麼? – Muis

+0

默認值是無(即沒有修飾符)。靜態變量沒有鏈接 - 它們不能從其他文件中引用。 – duskwuff

+0

那麼'沒什麼'和extern之間有什麼區別呢?因爲它聽起來像他們提供相同的。看起來很奇怪,默認情況下沒有選擇使用靜態的選項,因爲與其他文件相比,我需要全局變量的時間比我需要靜態的時間要少得多。希望GCC足夠聰明地在編譯時注意到變量不在其他地方使用,並將其編譯爲靜態。 – Muis