我曾经在嵌入式系统的项目中工作过,在那里我们重新安排了堆栈变量的声明顺序,以减小生成的可执行文件的大小。举例来说,如果我们有:C编译器能否重新安排堆栈变量?
void func()
{
char c;
int i;
short s;
...
}
我们将重新排序这是:
void func()
{
int i;
short s;
char c;
...
}
由于对准问题的第一个导致12个字节的堆栈空间被使用,第二个导致只有8个字节。
这是C编译器的标准行为还是我们使用的编译器的缺点?
在我看来,编译器应该能够重新排序堆栈变量,以支持更小的可执行文件大小,如果它想的话。有人向我建议,C标准的某些方面可以防止这种情况发生,但我无法以任何方式找到有信誉的来源。
作为一个额外的问题,这是否也适用于C++编译器?
编辑
如果答案是肯定的,C/C++编译器可以重新排列堆栈变量,你可以给一个编译器,绝对做到这一点的例子吗?我希望看到编译器文档或类似的东西来支持它。
再次编辑
谢谢大家的帮助。对于文档,我能找到的最好的东西是文件Optimal Stack Slot Assignment in GCC(pdf),由Naveen Sharma和Sanjiv Kumar Gupta在2003年GCC峰会会议上提交。
这里的问题项目是使用ADS编译器进行ARM开发。在该编译器的文档中提到,由于ARM-Thumb体系结构如何计算本地堆栈帧中的地址,因此像我所示的排序声明可以提高性能以及堆栈大小。该编译器不会自动重新安排当地人利用这一点。这里链接的文章说,从2003年起,GCC也没有重新安排堆栈框架来改善ARM-Thumb处理器的参考位置,但这意味着您可以。
我无法找到任何明确表示这已在GCC中实施的任何内容,但我认为这篇论文被认为是证明你们都是正确的。再次感谢。
这是一个很好的观点。当我和我的同事讨论这件事时,我并没有这样做。 – 2008-10-26 19:27:52
它甚至可以将多个变量分配到相同的寄存器或堆栈位置,如果它可以证明变量在相同的代码段中从不存在。这是很常见的做法,特别是内联代码会导致短暂的可变生命。 – 2008-10-26 21:05:51