【发布时间】:2018-06-25 01:04:35
【问题描述】:
为什么 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 编程语言中没有“堆栈”之类的东西。
-
@Lundin 是否有任何重要的“无堆栈”C 实现?
-
是的,有几个。例如,飞思卡尔/恩智浦 RS08 没有堆栈,但受 C 编译器支持。无论如何,我的观点是,C 标准的目的不是规定堆栈帧的格式和调用约定。这超出了编程语言标准的范围。
-
在所有可以用 C 实现的伟大事物中,这一点可能是无关紧要的。