7

如果您在编译器中启用了完全优化并且有这样的类设置:

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每个包装器“链”上的关键字,或者,因为这只是一个建议,编译器是否可以决定在没有关键字的情况下对其进行优化?

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

4

2 回答 2

8

此外,这是否需要每个包装器“链”上的 inline 关键字,或者,因为这只是一个建议,编译器是否可以决定在没有关键字的情况下对其进行优化?

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

一般来说,如果内联是可能的,编译器会根据被调用的函数体来决定是否内联。但是,如果函数是虚函数,或者函数的定义对编译器不可见,则内联可能根本不可能。

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

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

于 2013-03-28T23:39:29.860 回答
0

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

于 2013-03-28T23:38:56.637 回答