gpt4 book ai didi

在堆栈中创建大内存

转载 作者:太空宇宙 更新时间:2023-11-04 00:12:36 25 4
gpt4 key购买 nike

我试图在堆栈中创建大量内存 (int a[1000000000])。它编译成功。但是在运行时它出现了段错误。程序出现段错误是完全可以接受的。我的问题是,为什么编译器不能事先检测到并抛出编译错误?为什么要等到程序运行?

此外,当我分配 int a[100] 时,asm 代码如下所示。

00000000004004b4 <main>:
4004b4: 55 push %rbp
4004b5: 48 89 e5 mov %rsp,%rbp
4004b8: 48 81 ec 18 01 00 00 sub $0x118,%rsp (memory created for 100 bytes)

如果我为大内存创建 int a[1000000000],asm 代码看起来会有所不同。

00000000004004b4 <main>:
4004b4: 55 push %rbp
4004b5: 48 89 e5 mov %rsp,%rbp
4004b8: 49 bb 78 00 17 be 33 movabs $0xfffe9433be170078,%r11
4004bf: 94 fe ff
4004c2: 4c 01 dc add %r11,%rsp

有人可以解释一下吗?即为什么编译器不处理这个问题?

谢谢

child

最佳答案

why can't the compiler detect this beforehand and produce a compilation error or warning?

这个问题假设了一个不正确的前提。 技术上几乎没有什么可以阻止编译器编写者这样做。您可能希望它是一个警告而不是一个错误,但是编译器编写者可以很容易地为一个函数使用的本地存储总量设置一个不合理的巨大大小的阈值,并在该大小超过时发出警告超过。

由于您的问题基于错误的前提,因此没有答案。问一个更好的问题。

OK, if it is possible then why do compiler writers not implement this warning?

无论您的编译器是开源的还是闭源的,无论开发它的人是付费的还是志愿者,对软件的所有更改都需要时间努力。两者都供不应求。

编译器警告是特性,因此必须进行设计、指定、实现、测试、调试、交付和维护。所有这些事情在时间和精力上都是昂贵的,并且所有这些都其他功能中节省了时间和精力。

如果您喜欢的编译器中没有此功能,那是因为该编译器的开发人员有大约一百万件更好的事情要做。在这 100 万件更好的事情中,今年他们可能会设法实现几十件。如果您想提倡将您的特定功能建议从目前的低位提升到列表中,请开始召集编译器开发人员并向他们说明您的情况这是他们可以花费精力的最佳方式 -- 为明显虚假且会立即崩溃的情况创建警告。您可能不会走得太远。

在考虑要实现哪些编译器警告时,像我这样的编译器编写者会认真考虑要向编译器添加哪些警告。良好的警告可以识别以下情况:

  • 法律;非法代码当然是一个错误。
  • 可检测,误报率低;指示开发人员将正确的工作代码更改为损坏代码的警告是错误的警告
  • 误导;说过程序员应该相信代码做了一件事,而实际上它做了另一件事
  • 似是而非;程序员应该很可能在业务线程序中输入警告代码
  • 通过简单的测试无法检测到;该程序应该正常运行并做一些微妙的错误。如果程序立即崩溃,那么警告只是在测试发现它之前几秒钟发现了错误,这不是很好的值(value)。

您的提案符合前两个标准。它可以说符合第三种。它明确地不符合第四和第五个标准。因此,如果我是编译器开发人员,我会拒绝您的建议。我会花费宝贵的时间和精力来增加成本效益更大的功能。

关于在堆栈中创建大内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22081922/

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