繁体   English   中英

堆栈展开背后的机制是什么?

[英]What is the machinery behind stack unwinding?

我试图了解 C++ 中堆栈展开背后的机制。换句话说,我对如何实现此功能感兴趣(以及它是否是标准的一部分)。

因此,线程会执行一些代码,直到抛出异常。 抛出异常时,用于记录 state 和展开堆栈的线程/中断处理程序是什么? 标准保证了什么,具体实现是什么?

线程执行一些代码,直到抛出异常,并继续执行 异常处理依然是C++代码。

throw表达式创建了一个 C++ object,在抛出 function 的上下文中运行。当异常 object 的构造函数运行时,抛出 function 的 scope 中的所有对象仍然存在。

然而,紧接在堆栈展开之后。 C++ 编译器将安排一条返回路径,该路径不需要返回 object,但允许传递异常 object。就像正常返回一样,当 function 返回时,function 的本地对象将被销毁。 在二进制级别,这非常简单:它只是一堆析构函数调用,通常还会调整堆栈指针。

该标准也没有指定的是用于确定需要退出多少范围的机制。 该标准根据catch进行描述,但典型的 CPU 没有直接等效项。 因此,这通常是给定平台的 C++ ABI 的一部分,以便共享 ABI 的编译器同意。 ABI 兼容性要求调用者必须捕获来自被调用者的异常,即使它们是用不同的编译器编译的。 而且很明显,析构函数是要调用的,所以ABI也需要安排那个机制。 中间函数甚至可以由第三方编译器编译——只要它们共享一个 ABI,就应该可以正常工作。

如评论中所述, C++ 没有中断的概念。 如果操作系统需要通过中断发生某些事情,则编译器需要处理它。 C++ 代码当时究竟在做什么并不重要。

①如果本文未解决您的问题,请点击查看与本文相关的问题
②如果本文未解决您的问题,请向程序员专用AI小助手提问
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM