我一直在构建我自己的编译器,其中很大一部分显然是寄存器分配器,它尽可能有效地将临时变量与机器寄存器匹配起来。在像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个字节。
我的问题是,我怎样才能有效地分配不同大小的内存变量?
好的,谢谢。 – 2010-02-09 20:01:58