C++ 为什么堆栈跟踪会跳过一个显然必须被调用才能到达以下函数的函数?
给定这样的设置,其中DoFooStuff()被调用:C++ 为什么堆栈跟踪会跳过一个显然必须被调用才能到达以下函数的函数?,c++,debugging,callstack,C++,Debugging,Callstack,给定这样的设置,其中DoFooStuff()被调用: class Foo { public: void DoFooStuff(); // calls Bar::DoBarStuff() } class Bar { public: void DoBarStuff(); // Calls Bar::DoInternalBarStuff() protected: void DoInternalBarStuff(); } 是什么使我的堆栈跟踪能够准确显示这一点 Type
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);
这就是获取堆栈跟踪的位置。因此,编译器在某些优化级别执行自动内联。每天学习新事物。:)
(感谢您对我的有用评论。)因此,编译器在某些优化级别上执行自动内联。每天学习新事物。:)
(感谢您对我的帮助。)对Bar::DoBarInternalStuff的调用是Bar::DoBarStuff中的最后一个语句吗?如果是这样,那么在调用Bar::DoBarInternalStuff时,编译器很可能将Bar::DoBarStuff的堆栈框架替换为Bar::DoBarInternalStuff
这种优化在C/C++编译器中相当常见。当递归函数可以安排为递归调用是函数中的最后一个调用时,它减少了所需的堆栈深度。对Bar::DoBarInternalStuff的调用是Bar::DoBarStuff中的最后一个语句吗?如果是这样,那么在调用Bar::DoBarInternalStuff时,编译器很可能将Bar::DoBarStuff的堆栈框架替换为Bar::DoBarInternalStuff
这种优化在C/C++编译器中相当常见。当递归函数可以安排为递归调用是函数中的最后一个调用时,它减少了所需的堆栈深度。这些函数都不会在头中声明为内联。谢谢你的建议。我还喜欢你的名字:D编译器可以自由内联任何函数,即使没有内联声明。任何称职的编译器都会将内联函数作为理所当然的事情。@zindorsky:这种行为会局限于发布/发布版本吗?不管怎样,我找到了这个问题的答案:这些函数都不会在标题中声明为内联函数。谢谢你的建议。我还喜欢你的名字:D编译器可以自由内联任何函数,即使没有内联声明。任何称职的编译器都将内联函数,这是理所当然的。@zindorsky:这种行为会局限于发布/发布版本吗?不管怎样,我找到了这个问题的答案:好的,是的,就是这样。非常感谢你帮助我理解这一点!好的,是的,事情就是这样。非常感谢你帮助我理解这一点!