2012-05-17 70 views
2

使用外部鏈接符號(其他全局命名空間混亂/碰撞)有沒有什麼缺點?例如,我認爲如果我有一個我從來沒有調用的函數,如果它有內部鏈接,編譯器可以放棄它,但如果它是外部的,編譯器必須將該代碼留在內,因爲稍後有人可能會鏈接到它。它是否正確?還有其他的缺點嗎?外部鏈接缺陷

我在問,因爲我知道建議使用未命名的命名空間而不是static關鍵字,但由於未命名的命名空間中的符號仍然具有外部鏈接,因此它們將遭受上述缺點(如果我對此有所瞭解),以及所以並不比標準所說的靜態功能更好。

回答

2

未命名名稱空間中的函數具有外部鏈接的事實幾乎完全是一個技術問題。因爲它們具有「祕密」翻譯單元從屬唯一標識符,所以不可能從不同的翻譯單元命名它們。這意味着編譯器可以假定它們從來不會被其他翻譯單元的名稱調用。我知道的大多數實現都是在未命名的名稱空間中使用本地符號而不是全局符號,就像具有真正內部鏈接的函數一樣。

未命名的命名空間中的函數可以在不影響程序的情況下被丟棄,如果它永遠不會從定義它的翻譯單元調用,並且它永遠不會獲取其地址並將其從可能導致該地址的翻譯單元中取出被稱爲除直接命名函數調用以外的其他函數。

+0

*未命名的命名空間中的函數可以被丟棄而不影響程序* - 是,但是它?你知道編譯器實際上是這樣嗎? – baruch

+0

@baruch:是的,gcc在優化級別> ='-O1'處執行此操作。 –