2010-02-21 87 views
0

如果我在虛函數中使用內聯函數會發生什麼?我很困惑與像 http://www.parashift.com/c++-faq-lite/value-vs-ref-semantics.html#faq-31.6虛函數內聯函數會發生什麼情況?

我能理解它的問題,但就是意味着,它將非必要使用虛函數裏面(電話)內聯函數(請假設它是動態調用)?

class Wrapper 
{ 
public: 
    inline void doInlineJob() {;} 
}; 

class Base 
{ 
    virtual void foo() 
    { 
    //Do something 
    } 
}; 

class Derived: public Base 
{ 
    void foo() 
    { 
     wrapObj.doInlineJob(); 
    } 

    Wrapper wrapObj; 
}; 
+0

的parashift鏈接似乎被發現在它的解釋給我。哪一點讓你感到困惑?記住內聯是編譯器的_hint_ – zebrabox 2010-02-21 15:33:43

+0

謝謝大家的回覆。 @zebrabox我徘徊doInlineJob()實際上是內聯。 (比如我們在VC++中使用__forceinline) – Morpheus 2010-02-21 15:47:58

+0

@Morpheus。我明白了。正如其他人比我更有說服力和更明確地說,它很可能被內聯,因爲Derived :: foo不是虛擬的 – zebrabox 2010-02-21 16:30:30

回答

9

foo是否虛擬並不重要。只有doInlineJob是虛擬的才重要。這不是,所以它可以內聯沒有問題。

+0

啊......那是我想知道的。否則,根本沒有在OOP世界中使用內聯。 Bcz內聯函數可能會被虛函數包裝,然後變得毫無用處。 – Morpheus 2010-02-21 15:51:02

2

如果我在虛函數中使用內聯函數會發生什麼?

沒什麼特別的。如果編譯器同意,它將被內聯,否則它不會。就像從任何其他功能。

(請注意,關於函數的常見問題談判它們自己inlinevirtual在同一時間,這是不同的。)

+0

嘿! doInlineJob()在我的上下文中非常關鍵(實際上它是圖像處理系統中的像素訪問函數)。而且我使用虛擬(在OOP環境中)來管理我的系統。所以,如果doInlineJob()中的inline(ness)將被忽略,它將會對性能造成一定的損害。 – Morpheus 2010-02-21 16:02:23

+0

「foo()」是否爲「虛擬」並不重要。內聯是_called_函數的一個屬性,而不是調用的屬性。另外,'inline'(或通過在其類的定義中定義成員函數來隱式內聯)是編譯器提示你認爲內聯是好的。編譯器不需要遵循這些(只要想象一下標記一個遞歸函數'inline'),而且他們通常比你知道的要好。 (嚴重內聯可能導致代碼膨脹,從而增加工作集,從而降低應用程序的性能。)先測量,然後再調整,然後再測量一次。 – sbi 2010-02-21 16:07:24

+0

非常感謝您的回覆。 「內聯是被調用函數的一個屬性」,這是我想知道的。順便說一句,在VC + __forceinline也只是一個提示? (即使他們打算將__forceinline付諸行動,我也知道有規則) – Morpheus 2010-02-21 16:12:17

相關問題