C ++:函数包装器是否与内联一起使用?

时间:2013-03-28 23:35:57

标签: c++ performance inline wrapper

如果您已在编译器中启用了完全优化,并且类设置如下:

class A
{
    void Do_A_Stuff();
};
class B
{
    A a;
    void Do_B_Stuff() { a.Do_A_Stuff(); }
};
class C
{
    B b;
    void Do_C_Stuff() { b.Do_B_Stuff(); }
};
class D
{
    C c;
    void Do_D_Stuff() { c.Do_C_Stuff(); }
};

是否存在调用Do_D_Stuff()比直接调用Do_A_Stuff()要慢的情况?此外,这是否需要每个包装器'链'上的inline关键字,或者,因为它只是一个建议,编译器是否可以决定在没有关键字的情况下优化它?

我意识到有很多关于内联可用的信息,但我找不到任何关于将许多包装器链接在一起的信息。

2 个答案:

答案 0 :(得分:7)

  

此外,这是否需要每个包装器'链'上的内联关键字,或者,因为它只是一个建议,编译器是否可以决定在没有关键字的情况下优化它?

是的,编译器可以决定优化它,即使你指定了inline关键字,它也可以决定来优化它(如果适当的编译器可能会产生警告)选项已设置) - 注意,类定义中定义的成员函数被隐式标记为inline

通常,如果可以进行内联,编译器将根据被调用函数的主体决定是否内联。但是,如果函数是虚函数,或者函数的定义对编译器不可见,则内联可能根本不可能。

如果满足内联的条件并且编译器认为合适,则在函数调用链的内联中不存在技术问题。

作为次要评论,请注意您的类中的函数应为public,否则包装器将无法访问它们。

答案 1 :(得分:0)

函数在类定义中定义,因此在这种情况下隐式inline关键字。