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

Jos*_*vin 7 c c++ stack memory-management allocation

如果您编写的应用程序是:

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

现代整个程序优化编译器可以优化所有堆栈分配(例如GCC,MSVC,ICC)吗?在这种情况下,它似乎应该能够静态地分配所有可能的堆栈空间."整个程序"我的意思是编译器可以访问/ all /源代码(在运行时没有可能的dlopen'ing事物等).

Kag*_*nar 1

这是一条太长的评论:

请注意,虽然理论上所有堆栈分配都可以被优化掉,但可能会分配比必要的更多的堆栈分配。这不是OP所要求的,但考虑一下可能很有趣。找到所需的最小分配量相当于解决停机问题。想象一个程序的结构如下:

<do 'something'>
<call last thing which happens to require more
 stack space than everything else in 'something'>
Run Code Online (Sandbox Code Playgroud)

仅当“停止”时才需要额外的堆栈空间<do 'something'>

您还可以想象优化变得任意困难的其他变体。例如,您的程序可以简单地使用用户输入计算 3SAT 表达式,并根据该输入执行某些操作 - 但该 3SAT 表达式可能有也可能没有任何导致 true 的值。

也许存在更微不足道的情况:用户可能永远不会输入需要更多堆栈空间进行处理的输入。

  • 请注意,解决停机问题“一般来说”是不可行的。但是,对于某些类别的程序,可以检查是否停止。我非常确定调用图中没有循环的程序就是这样一类程序。此外,我认为OP并没有要求尽可能小的堆栈空间,只是一个固定的上限。在这种情况下,整个停机问题都是不必要的。 (4认同)