gpt4 book ai didi

c++ - C 编译器可以重新排列堆栈变量吗?

转载 作者:IT老高 更新时间:2023-10-28 22:22:43 26 4
gpt4 key购买 nike

我过去曾参与过嵌入式系统的项目,我们重新安排了堆栈变量的声明顺序以减小生成的可执行文件的大小。例如,如果我们有:

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 中实现过的东西,但我认为这篇论文可以证明你是正确的。再次感谢。

最佳答案

编译器不仅可以重新排序局部变量的堆栈布局,还可以将它们分配给寄存器,将它们分配给有时在寄存器中有时在堆栈中,它可以将两个局部变量分配给内存中的同一个槽(如果它们的生存范围不重叠),甚至可以完全消除变量。

关于c++ - C 编译器可以重新排列堆栈变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/238441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com