编译器如何在堆栈上安排局部变量?

rem*_*inn 2 variables stack

我们知道,局部变量位于堆栈上.但是,他们的订单是什么?它们是按照声明的顺序排列的吗?这意味着第一个声明的变量排列在堆栈的较高地址上(堆栈增长到较低的地址)?举个例子:

void foo(){
 int iArray[4];
 int iVar;
}
Run Code Online (Sandbox Code Playgroud)

在堆栈上,局部变量 - iArray并按如下iVar方式排列?

替代文字

Jam*_*son 5

只有关闭了优化!

一旦优化器获得您的代码,所有投注都将被取消.积极优化的常见策略是:

  • 如果变量从未使用过,则删除该变量,或者只是另一个变量的副本.
  • 按照使用顺序重新排序变量.如果您的应用使用交换空间并且还有助于缓存利用率(在某些计算机上),这将极大地帮助您.
  • 将常用变量移动到寄存器中.常见的风险机制有32个可爱的文字目的寄存器.英特尔的八个单用途寄存器并不常见.
  • 更改数据类型.例如,将小的int注入intgers通常会加快寄存器加载和缓存.
  • 重新排序存储以最小化松弛字节.例如char a,double b,char c,int d可以重新排序为double b,int d,char a,char c,从而节省10个字节.