4

我想知道 ISA 中的任何内容是否会使堆栈长大(push 增加 sp,pop 减少它)性能降低或以其他方式不明智?我知道这不是当今工具的工作方式,包括 Linux 和 GCC 端口,但是除了“这将是一个疯狂的工作量”之外,还有什么根本原因吗?

4

2 回答 2

2

我可以想到两个原因,除了改变软件需要做大量工作之外,它还会出现问题。

第一个是关于 RISC V:压缩指令旨在以正偏移量存储到堆​​栈中,范围为sp+0to sp+252(4 的倍数),而不是期望降序堆栈:访问 sp+N,其中 N>=0,即分配的堆栈内存,可以是简单的一项一项一项地压入堆栈,也可以是函数的整个堆栈帧。对于升序堆栈, sp+N 其中 N>=4 是我们通常不希望访问的空闲堆栈内存,因此您会为基于内存的局部变量和参数松散压缩指令加载和存储。

第二个是实际问题而不是 RISC V 问题:当使用升序堆栈时,堆栈指针指向堆栈顶部的项目的末尾。我们通常通过它们的第一个和最低地址来引用内存对象。当不同大小的项目被放置到升序堆栈上时,堆栈顶部的项目的地址,sp根据项目的大小而变化的偏移量 - 这不会发生在降序堆栈中。

除了上述之外,例如关于性能,我认为硬件不会关心。

于 2022-02-06T19:00:47.603 回答
1

它可能就像在微码中翻转一点以添加而不是从 sp 中减去一样简单。

我能想到的根本原因是

  • 惯性。当需要对每个工具链进行更改时,您为什么要这样做?
  • 安装底座。许多代码可能会假设堆栈的增长方向。你需要一个很好的理由来破坏现有的代码。
  • 复杂。随着从堆向更高地址的分配增长,您是否也想扭转这种情况以保持堆和堆栈相互增长?
于 2020-10-06T17:05:49.083 回答