有这段代码:
char text[] = "zim";
int x = 777;
如果我查看放置x和文本的堆栈,那么输出为:
09 03 00 00 7a 69 6d 00
其中:
现在有try..catch:
的代码char text[] = "zim";
try{
int x = 777;
}
catch(int){
}
堆栈:
09 03 00 00 **97 85 04 08** 7a 69 6d 00
现在 text 和 x 之间放置了新的4字节值。如果我添加另一个catch,那么会有类似的东西:
09 03 00 00 **97 85 04 08** **xx xx xx xx** 7a 69 6d 00
等等。我认为这是与异常处理相关的一些值,它在堆栈展开期间用于在try块中抛出异常时找到适当的catch。然而问题是,这个4字节值到底是什么(可能是一些地址给了处理器结构或一些id)?
我在32位Linux机器上使用g ++ 4.6。
答案 0 :(得分:5)
AFAICT,这是指向“展开桌”的指针。根据{{3}},进程“[使用]展开表,[找到]如何处理在该PC上发生的异常的信息,特别是获取该地址范围的个性例程的地址。 “
展开表背后的想法是很少使用堆栈展开所需的数据。因此,将指针放在堆栈上并将数据的重新存储在另一页中更有效。在最好的情况下,该页面可以保留在磁盘上,甚至不需要加载到RAM中。相比之下,C风格的错误处理通常会在L1缓存中结束,因为它都是内联的。
答案 1 :(得分:0)
毋庸置疑,这一切都取决于平台等等。
这可能是一个地址。它可能指向代码段(某个处理程序地址)或数据段(指向带有帧信息的构建时生成结构的指针),或者指向同一线程的堆栈(指向运行时生成的表的指针)框架信息)。 或者它也可能是垃圾,由于对齐要求而离开,EH可能会要求。
例如在Win32 / x86上没有这样的差距。对于使用异常处理的每个函数(具有try/catch
或__try/__except/__finally
或具有d'tors的对象) - 编译器生成在堆栈上分配的EXCEPTION_RECORD
结构(由函数prolog)码)。然后,每当函数内的某些内容发生变化时(对象被创建/销毁,try/catch
块进入/退出) - 编译器会添加一条修改此结构的指令(更正确地 - 修改其扩展名)。但是没有更多的东西在堆栈上分配。