1

给定这样的设置,其中调用 DoFooStuff() :

class Foo {
public:
    void DoFooStuff(); // calls Bar::DoBarStuff()
}

class Bar {
public:
    void DoBarStuff(); // Calls Bar::DoInternalBarStuff()
protected:
    void DoInternalBarStuff();
}

是什么使我的堆栈跟踪可以准确显示这一点?:

Type                   Function
void                   Bar::DoInternalBarStuff()
void                   Foo::DoFooStuff()

对 DoInternalBarStuff() 的唯一引用是在 DoBarStuff() 中。DoInternalBarStuff() 在它的第一行断言:

assert(false);

这就是堆栈跟踪的位置。

4

2 回答 2

4

对 Bar::DoBarInternalStuff 的调用是 Bar::DoBarStuff 中的最后一条语句吗?如果是这样,编译器很可能在调用 Bar::DoBarInternalStuff 时将 Bar::DoBarStuff 的堆栈帧替换为 Bar::DoBarInternalStuff。

这种尾调用优化在 C/C++ 编译器中相当普遍。当可以安排递归函数以使递归调用是函数中的最后一次调用时,它减少了所需的堆栈深度。

于 2013-07-11T03:04:40.230 回答
0

所以事实证明编译器会在某些优化级别进行自动内联。每天学习新事物。:)

GCC 内联 C++ 函数是否没有“内联”关键字?

(感谢您向我展示了这一点的有用评论。)

于 2013-07-11T03:00:42.497 回答