为什么 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/