scd*_*dmb 10 c++ exception-handling g++
有这个代码:
char text[] = "zim";
int x = 777;
Run Code Online (Sandbox Code Playgroud)
如果我查看放置x和文本的堆栈,那么输出是:
09 03 00 00 7a 69 6d 00
Run Code Online (Sandbox Code Playgroud)
哪里:
现在有try..catch的代码:
char text[] = "zim";
try{
int x = 777;
}
catch(int){
}
Run Code Online (Sandbox Code Playgroud)
堆:
09 03 00 00 **97 85 04 08** 7a 69 6d 00
Run Code Online (Sandbox Code Playgroud)
现在text和x之间放置了新的4字节值.如果我添加另一个捕获,那么会有类似的东西:
09 03 00 00 **97 85 04 08** **xx xx xx xx** 7a 69 6d 00
Run Code Online (Sandbox Code Playgroud)
等等.我认为这是与异常处理相关的一些值,它在堆栈展开期间用于在try块中抛出异常时找到适当的catch.然而问题是,这个4字节值到底是什么(可能是一些地址到一个感知处理程序结构或一些id)?
我在32位Linux机器上使用g ++ 4.6.
AFAICT,这是一个指向"展开桌子"的指针.根据Itanium ABI实现建议,进程"[使用]展开表,[找到]如何处理在该PC上发生的异常的信息,特别是获取该地址范围的个性例程的地址. "
展开表背后的想法是很少使用堆栈展开所需的数据.因此,将指针放在堆栈上并将数据的重新存储在另一页中更有效.在最好的情况下,该页面可以保留在磁盘上,甚至不需要加载到RAM中.相比之下,C样式错误处理通常最终在L1缓存中,因为它全部是内联的.