c - 为什么 C 从未实现 "stack extension"?

标签 c stack

为什么 C 从未实现“堆栈扩展”以允许从调用者引用被调用函数的(动态大小的)堆栈变量?

这可以通过扩展调用者的栈帧以包含来自被调用者的栈帧的“动态返回”变量来实现。 (你可以,但不应该,用来自调用者的 alloca 来实现它——它可能无法在优化后继续存在。)

例如如果我想返回动态大小的字符串“e”,实现可以是:

--+---+-----+
  | a |  b  |
--+---+-----+

callee(d);

--+---+-----+---------+---+
  | a |  b  |  junk   | d |    
--+---+-----+---------+---+

char e[calculated_size];

--+---+-----+---------+---+---------+
  | a |  b  |  junk   | d |    e    |    
--+---+-----+---------+---+---------+

dynamic_return e;

--+---+-----+-------------+---------+
  | a |  b  |    waste    |    e    |
--+---+-----+-------------+---------+

(“垃圾”包含程序不可见的返回地址和其他系统特定的元数据。)

这会在使用时浪费一点堆栈空间。

好处是简化了字符串处理,以及当前必须 malloc ram 的任何其他函数,返回指针并希望调用者记住 free 在正确的时间。

显然,在 C 生命的这个阶段向它添加这样的功能是没有意义的,我只是想知道为什么这不是一个好主意。

最佳答案

一个新对象可能会通过许多层软件返回。因此,浪费的空间可能来自数十个甚至数百个函数调用。

再考虑一个执行某些迭代任务的例程。在每次迭代中,它从子例程中获取一些新分配的对象,并将其插入到链表或其他数据结构中。这样的迭代任务可能会重复数百、数千或数百万次迭代。堆栈将因空间浪费而溢出。

关于c - 为什么 C 从未实现 "stack extension"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48279268/

相关文章:

c - 链接 .c 和 .h 文件

IOCTL 可以用于向驱动程序发送自定义输入吗

c - 当您访问前一个堆栈变量时会发生什么?

gcc - 栈分配,为什么要多出空间?

Java 与 C 输出

c - 我没有正确使用 fseek() 吗?

c - 从 C 中的 MMAP 中删除空格

c++ - 运行时堆栈是否保存在内存的数据段中?

c++ - 动态堆栈内存重新分配

java - 为非泛型堆栈类编写方法如何工作?