如果您已在编译器中启用了完全优化,并且类设置如下:
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
关键字,或者,因为它只是一个建议,编译器是否可以决定在没有关键字的情况下优化它?
我意识到有很多关于内联可用的信息,但我找不到任何关于将许多包装器链接在一起的信息。
答案 0 :(得分:7)
此外,这是否需要每个包装器'链'上的内联关键字,或者,因为它只是一个建议,编译器是否可以决定在没有关键字的情况下优化它?
是的,编译器可以决定优化它,即使你指定了inline
关键字,它也可以决定不来优化它(如果适当的编译器可能会产生警告)选项已设置) - 注意,类定义中定义的成员函数被隐式标记为inline
。
通常,如果可以进行内联,编译器将根据被调用函数的主体决定是否内联。但是,如果函数是虚函数,或者函数的定义对编译器不可见,则内联可能根本不可能。
如果满足内联的条件并且编译器认为合适,则在函数调用链的内联中不存在技术问题。
作为次要评论,请注意您的类中的函数应为public
,否则包装器将无法访问它们。
答案 1 :(得分:0)
函数在类定义中定义,因此在这种情况下隐式inline
关键字。