过去我从事过嵌入式系统的项目,我们重新安排了堆栈变量的声明顺序以减小生成的可执行文件的大小。例如,如果我们有:
void func()
{
char c;
int i;
short s;
...
}
我们将其重新排序为:
void func()
{
int i;
short s;
char c;
...
}
由于对齐问题,第一个导致使用了 12 个字节的堆栈空间,而第二个导致仅使用了 8 个字节。
这是 C 编译器的标准行为还是我们使用的编译器的一个缺点?
在我看来,如果编译器愿意,它应该能够重新排序堆栈变量以支持更小的可执行文件大小。有人向我建议 C 标准的某些方面阻止了这种情况,但无论哪种方式我都无法找到有信誉的来源。
作为一个额外的问题,这是否也适用于 C++ 编译器?
编辑
如果答案是肯定的,C/C++ 编译器可以重新排列堆栈变量,你能举一个绝对做到这一点的编译器的例子吗?我想查看编译器文档或类似的东西来支持这一点。
再次编辑
谢谢大家的帮助。对于文档,我能找到的最好的东西是 Naveen Sharma 和 Sanjiv Kumar Gupta 的论文GCC 中的 Optimal Stack Slot Assignment (pdf),它在 2003 年的 GCC 峰会上发表。
这里讨论的项目是使用 ADS 编译器进行 ARM 开发。在该编译器的文档中提到,像我展示的排序声明可以提高性能以及堆栈大小,因为 ARM-Thumb 体系结构如何计算本地堆栈帧中的地址。该编译器不会自动重新排列本地变量以利用这一点。此处链接的论文说,截至 2003 年,GCC 也没有重新排列堆栈帧以改善 ARM-Thumb 处理器的参考位置,但这意味着您可以。
我找不到任何可以肯定地说这曾经在 GCC 中实现过的东西,但我认为这篇论文可以证明你都是正确的。再次感谢。