Memory management 在不同大小的堆栈上执行编译器内存分配

Memory management 在不同大小的堆栈上执行编译器内存分配,memory-management,register-allocation,Memory Management,Register Allocation,我一直在构建自己的编译器,其中很大一部分显然是寄存器分配器,它尽可能有效地将临时变量与机器寄存器匹配。在x86这样的体系结构上,寄存器不多,因此存在大量溢出,变量必须存储在内存(堆栈)中。还有一些变量存储在内存中,因为它们太大,无法放入寄存器 实际上再次调用寄存器分配器来有效地分配内存中的变量,以便尽可能多地共享空间。真正的问题是,没有办法约束寄存器分配器将两个变量彼此相邻地放置在内存中(因为我可以将较大的变量作为若干较小的变量赋予它),并允许分配器移动较小的变量,以便较大的变量能够适配,我想知

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

实际上再次调用寄存器分配器来有效地分配内存中的变量,以便尽可能多地共享空间。真正的问题是,没有办法约束寄存器分配器将两个变量彼此相邻地放置在内存中(因为我可以将较大的变量作为若干较小的变量赋予它),并允许分配器移动较小的变量,以便较大的变量能够适配,我想知道是否有任何算法可以处理这个问题,否则我必须将内存划分为不同的区域,每个区域包含不同大小的变量

下面是一个例子来说明这一点:

void f(){
    int32_t a, b;
    //something happens to a and b...
    int64_t c;
    //something happens to c...
}
在本例中,这里有一些假设……变量没有优化掉,一旦定义了c,a和b就不再有用,所有变量都分配给堆栈内存。很明显,我希望“c”使用与刚才使用的“a”和“b”相同的内存,因此只分配8个字节,但是我的编译器的当前版本将分配整整16个字节


我的问题是,如何在不同大小的内存中有效地分配变量

显然,寄存器分配器不够通用,无法分配堆栈空间,因为至少在x86上合并相邻寄存器是没有意义的

为什么不扩展它来实现这一点呢?或者,更好的方法是对其进行分割或子类化,以直接处理寄存器和堆栈分配


至于堆栈分配器,在两个变量由于作用域不重叠而共享同一分配的情况下,最小化堆栈通常既不节省执行时间,也不节省空间。在范围转换时分配和取消分配额外堆栈空间的操作不太值得。即使是在最关键的实时处理中,人们通常对健壮性和速度的兴趣也远大于削减几个字节的堆栈空间。

显然,寄存器分配器不够通用,无法分配堆栈空间,因为至少在x86上合并相邻寄存器是没有意义的

为什么不扩展它来实现这一点呢?或者,更好的方法是对其进行分割或子类化,以直接处理寄存器和堆栈分配

至于堆栈分配器,在两个变量由于作用域不重叠而共享同一分配的情况下,最小化堆栈通常既不节省执行时间,也不节省空间。在范围转换时分配和取消分配额外堆栈空间的操作不太值得。即使是在最关键的实时处理中,人们通常对健壮性和速度比减少几个字节的堆栈空间更感兴趣