Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:函数包装器是否与内联一起工作?_C++_Performance_Inline_Wrapper - Fatal编程技术网

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()中的代码吗?(我试图弄清楚最终结果是否会跳过多个包装的“开销”)谢谢@乔纳森:是的,那就是会发生的事