2010-02-21 84 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

相关问题