由於boost::shared_ptr
可能會被非常頻繁地調用,並且只是返回一個指針,是不是->
運算符是一個很好的候選人,因爲它是inlined
?爲什麼boost :: shared_ptr - >運算符不是內聯的?
T * operator->() const // never throws
{
BOOST_ASSERT(px != 0);
return px;
}
會不會有一個好的編譯器自動inline
這呢?
我應該對此失眠嗎? :-)
由於boost::shared_ptr
可能會被非常頻繁地調用,並且只是返回一個指針,是不是->
運算符是一個很好的候選人,因爲它是inlined
?爲什麼boost :: shared_ptr - >運算符不是內聯的?
T * operator->() const // never throws
{
BOOST_ASSERT(px != 0);
return px;
}
會不會有一個好的編譯器自動inline
這呢?
我應該對此失眠嗎? :-)
難道一個好的編譯器會自動內聯嗎?
很可能,是的,它會的。
我應該對此失眠嗎?
最好不要。如果你想超級確定(或者你是超級好奇),請檢查從你的編譯器發出的程序集。
在類內部定義的函數(即使用body)是隱含的內聯候選項。在這些情況下,沒有必要使用inline
關鍵字,這樣做很不尋常。
請注意shared_ptr
是一類模板,所以它的成員函數實際上函數模板。
由於不是export
版,他們不僅必須宣佈,也定義在使用它們所有的翻譯單位,就像與inline
存儲符定義的函數。
某種程度上,template
也意味着inline
。
現在,一個好的優化編譯器會比你決定什麼應該內聯更好,所以會忽略'inline'關鍵字。 – 2010-05-18 15:31:55
@藍色:無論如何,忽略內聯部分。但是你是對的:編譯器完全內聯,而不管內聯關鍵字。沒有'inline'和'inline''d函數都可以內聯。 – GManNickG 2010-05-19 06:15:43
@ BlueRaja-DannyPflughoeft,@GMan:你已經過分概括了這一點。如果您無法在開啓完全優化的情況下進行編譯(無論出於何種原因),您可能想要控制哪些函數需要內聯或不內聯。然後'內聯'變得不那麼不相關。我不是專家,但我猜這是關鍵字存在的原因之一。 – 2011-10-07 10:23:17