gpt4 book ai didi

c++ - 异常处理器

转载 作者:可可西里 更新时间:2023-11-01 16:16:29 24 4
gpt4 key购买 nike

有这段代码:

char text[] = "zim";
int x = 777;

如果我查看 x 和文本所在的堆栈,输出为:

09 03 00 00 7a 69 6d 00

地点:

  • 09 03 00 00 = 0x309 = 777 <- int x = 777
  • 7a 69 6d 00 = char text[] = "zim"(ASCII 码)

现在有带有 try..catch 的代码:

char text[] = "zim";
try{
int x = 777;
}
catch(int){
}

堆栈:

09 03 00 00 **97 85 04 08** 7a 69 6d 00

现在 textx 之间放置了新的 4 字节值。如果我再添加一个 catch,就会出现类似这样的内容:

09 03 00 00 **97 85 04 08** **xx xx xx xx** 7a 69 6d 00

等等。我认为这是与异常处理相关的一些值,它在堆栈展开期间用于在 try block 中抛出异常时找到合适的捕获。然而问题是,这个 4 字节的值到底是什么(可能是异常处理程序结构的某个地址或某个 ID)?

我在 32 位 Linux 机器上使用 g++ 4.6。

最佳答案

AFAICT,这是指向“展开表”的指针。根据 the Itanium ABI implementation suggestions ,进程“[使用] 展开表,[来] 查找有关如何处理该 PC 上发生的异常的信息,特别是获取该地址范围内的个性例程的地址。”

展开表背后的想法是很少使用堆栈展开所需的数据。因此,将指针放在堆栈上,并将剩余数据存储在另一个页面中会更有效。在最好的情况下,该页面可以保留在磁盘上,甚至不需要加载到 RAM 中。相比之下,C 风格的错误处理通常在 L1 缓存中结束,因为它都是内联的。

关于c++ - 异常处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9250609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com