gpt4 book ai didi

c++ - 没有堆栈分配整个程序编译?

转载 作者:可可西里 更新时间:2023-11-01 18:38:00 30 4
gpt4 key购买 nike

如果您编写的应用是:

  • 单线程
  • 在调用图中没有循环
  • 不使用 alloca 或 VLAs

现代整体程序优化编译器能否优化所有堆栈分配(例如 GCC、MSVC、ICC)?在那些情况下,它似乎应该能够静态分配所有可能的堆栈空间。 “整个程序”是指编译器可以访问/所有/源代码(不可能在运行时 dlopen'ing 等)。

最佳答案

如果您可以保证您陈述的条件,那么是的:可以有效地完全静态分配堆栈。每个函数都有一 block 堆栈内存。

但是,实际的编译器会这样做吗?没有。

这样做绝对没有任何好处。事实上,它可能比一无所获。通常,大部分工作堆栈都在缓存中,因此对其进行修改非常便宜。如果堆栈在静态内存中,那么任何特定函数的“堆栈”内存将被缓存的唯一时间是您最近调用了该函数。使用真正的堆栈,您更有可能在缓存中工作。

此外,为每个函数分配一 block 堆栈内存很容易使您的程序的静态内存使用量大大超过其需要的数量。堆栈是一个固定大小的结构;无论你有多少个函数,堆栈都会占用一定的大小。如果您有 100,000 个函数,并且每个函数占用 64 字节的空间,那么您的静态“堆栈”必须占用 ~6.4MB 的空间。

为什么?您永远不会在任何时候使用大部分内存。该程序可以在 1MB 甚至 512KB 的堆栈中正常运行;为什么要白白占用 6 倍的内存?

所以它既不是性能优化会膨胀你的程序的内存。

关于c++ - 没有堆栈分配整个程序编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10074309/

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