2017-04-07 98 views
0

當我在幾個翻譯單元中調用以下內聯函數時,我對「引擎蓋下」究竟發生了什麼感興趣。內嵌函數中的靜態變量

namespace some_name 
{ 
    inline const float& get_float() 
    { 
     static const float a = 5.0f; 
     return a; 
    } 
} 

我的目的是創建一個外部連接的變量「a」,其可以在整個代碼中使用(如果包括與命名空間中的報頭),而且還我想防止任何改變這個變量。從測試看來,我似乎成功了,但是我對第一次和接下來幾次調用此函數時發生的事情感興趣。

其他問題我是否用靜態變量聲明/定義來污染全局名稱空間?

+1

作爲使函數返回靜態常量浮點數的一種替代方法,爲什麼不把它作爲類的成員變量,甚至是命名空間;它仍然是const ... – UKMonkey

+0

UKMonkey我不確定,如果我這樣做,那麼每次我在不同的翻譯單元中使用該變量時,我會得到一個const float類型的副本。 – user3271640

+1

你確定這種方式'a'是外部鏈接嗎?爲什麼你甚至需要一個外部連接的常量?外部鏈接表明多個編譯單元共享變量的一個實例,當它變化時,每個單元都會讀取更新後的值。但恆定不會改變。而且,在許多情況下,編譯器會將常數值直接嵌入到指令中,以至於它甚至不會出現在內存中。 –

回答

0

但是我對第一次和接下來幾次調用這個函數時會發生什麼感興趣。

初始化是靜態的(不依賴於運行時的任何東西),所以它可能在程序開始時執行。所有的調用只是返回一個對靜態對象的引用。而這些調用可能是內聯的擴展,所以直接使用靜態對象。

更簡單的選項是在名稱空間中使用全局變量。

其他問題:我用靜態變量聲明/定義污染全局名稱空間嗎?

不是。靜態變量是本地的,所以不會污染任何名稱空間。函數本身會「污染」聲明它的名稱空間。

+0

命名空間中的「靜態」變量會做相反的事情,即爲每個包含頭的TU定義一個這樣的變量。 – Quentin

+0

@Quentin是的,我的意思是一個全局變量(即靜態存儲的非局部變量)。儘管如此,這對於常量來說並不重要,因爲不同編譯單元的重複無論如何都被壓扁了,不是嗎? – user2079303

+0

@Quentin這正是我很好奇的。這就是爲什麼我沒有在命名空間中定義變量的原因。我想直接在包含這個頭的所有TU中使用特定的一個靜態對象。 – user3271640