2010-05-18 75 views
2

由於boost::shared_ptr可能會被非常頻繁地調用,並且只是返回一個指針,是不是->運算符是一個很好的候選人,因爲它是inlined爲什麼boost :: shared_ptr - >運算符不是內聯的?

T * operator->() const // never throws 
{ 
    BOOST_ASSERT(px != 0); 
    return px; 
} 

會不會有一個好的編譯器自動inline這呢?

我應該對此失眠嗎? :-)

+0

現在,一個好的優化編譯器會比你決定什麼應該內聯更好,所以會忽略'inline'關鍵字。 – 2010-05-18 15:31:55

+0

@藍色:無論如何,忽略內聯部分。但是你是對的:編譯器完全內聯,而不管內聯關鍵字。沒有'inline'和'inline''d函數都可以內聯。 – GManNickG 2010-05-19 06:15:43

+0

@ BlueRaja-DannyPflughoeft,@GMan:你已經過分概括了這一點。如果您無法在開啓完全優化的情況下進行編譯(無論出於何種原因),您可能想要控制哪些函數需要內聯或不內聯。然後'內聯'變得不那麼不相關。我不是專家,但我猜這是關鍵字存在的原因之一。 – 2011-10-07 10:23:17

回答

4

難道一個好的編譯器會自動內聯嗎?

很可能,是的,它會的。

我應該對此失眠嗎?

最好不要。如果你想超級確定(或者你是超級好奇),請檢查從你的編譯器發出的程序集。

18

在類內部定義的函數(即使用body)是隱含的內聯候選項。在這些情況下,沒有必要使用inline關鍵字,這樣做很不尋常。

1

請注意shared_ptr是一類模板,所以它的成員函數實際上函數模板

由於不是export版,他們不僅必須宣佈,也定義在使用它們所有的翻譯單位,就像與inline存儲符定義的函數。

某種程度上,template也意味着inline

相關問題