C++ C++;:函数包装器是否与内联一起工作?
如果在编译器中启用了完全优化,并且类设置如下:C++ C++;:函数包装器是否与内联一起工作?,c++,performance,inline,wrapper,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(); } }
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\u Stuff()
比直接调用Do\u Stuff()
要慢?此外,这是否需要在每个包装器“链”上使用inline
关键字,或者,由于这只是一个建议,编译器是否可以决定在不使用关键字的情况下对此进行优化
我知道有很多关于内联的信息可用,但我找不到任何关于将许多包装链接在一起的具体信息。函数是在类定义中定义的,因此在这种情况下,
inline
关键字是隐式的
此外,这是否需要在每个包装器“链”上使用内联关键字,或者,由于这只是一个建议,编译器是否可以决定在不使用关键字的情况下对此进行优化
是的,编译器可以决定对其进行优化,也可以决定不进行优化,即使您指定了inline
关键字(如果设置了适当的编译器选项,可能会产生警告)-注意,类定义中定义的成员函数隐式标记为inline
通常,如果可以内联,编译器将根据调用的函数体决定是否内联。但是,如果函数是虚拟函数,或者函数的定义对编译器不可见,则可能根本不可能进行内联
如果满足内联的条件并且编译器认为合适,那么在函数调用链上进行内联不会有技术问题
请注意,类中的函数应该是
public
,否则包装程序将无法访问它们。需要注意的是,即使在类定义之外使用inline
,也不能保证编译器将inline
您的代码。这取决于编译器。编译器可以内联函数未标记为内联
,也可以内联函数未标记为内联
。是的,函数应该是公共
,我是为了简洁。:)“或者如果函数的定义对编译器不可见。”-这是否适用于MSVC(或其他编译器中的等效程序)?我一直对此很好奇。@JBentley:跨模块内联也是可能的,是的。还有一个你可以检查的。谢谢你的支持remark@AndyProwl在我将此标记为答案之前,我只想澄清一件事,如果我的示例中的所有函数都是内联的,那么对Do\u Stuff()
的调用在编译后基本上会直接运行Do\u Stuff()中的代码吗?(我试图弄清楚最终结果是否会跳过多个包装的“开销”)谢谢@乔纳森:是的,那就是会发生的事