2010-02-09 43 views
1

我一直在构建我自己的编译器,其中很大一部分显然是寄存器分配器,它尽可能有效地将临时变量与机器寄存器匹配起来。在像x86这样的体系结构中,没有太多的寄存器,所以有很多溢出变量必须存储在内存中(堆栈)。也有变量存储在内存中,因为它们太大而无法放入寄存器。在不同大小的堆栈上执行内存编译器分配

寄存器分配器实际上被再次调用来有效地分配内存中的变量,以便尽可能多地共享空间。真正的问题是,没有办法限制寄存器分配器将两个变量放在内存中彼此相邻的位置(因为我可以给它更大的变量作为一些较小的变量),并允许分配器移动较小的变量所以更大的变量可以适应,我想知道是否有任何算法来处理这个问题,否则我必须将内存分成不同的区域,每个区域都保存不同大小的变量。

下面就来演示这样的例子:

void f(){ 
    int32_t a, b; 
    //something happens to a and b... 
    int64_t c; 
    //something happens to c... 
} 

有几个假设,使这里的例子...的目的,该变量不是优化掉,A和B都不再一旦c被定义并且所有的变量都被分配给堆栈内存,这个函数很有用。很明显,我希望'c'使用与'a'和'b'相同的内存,因此只分配8个字节,但是我的编译器的当前版本将分配完整的16个字节。

我的问题是,我怎样才能有效地分配不同大小的内存变量?

回答

1

显然,寄存器分配器不足以分配堆栈空间,因为合并相邻的寄存器是没有意义的,至少在x86上是合理的。

为什么不扩展它来做到这一点?或者,更好的是将其划分或继承,直接处理寄存器和堆栈分配。

至于堆栈分配器,它通常不是执行时间效率高的,也不是特别节省空间以最小化在(罕见)情况下使用的堆栈,即由于非重叠范围,两个变量可以共享相同的分配。在范围转换处分配和释放额外堆栈空间的操作不太值得。即使在最关键的实时处理中,人们通常对稳健性和速度更感兴趣,而不是削减几个字节的堆栈空间。

+0

好的,谢谢。 – 2010-02-09 20:01:58