我一直在构建自己的编译器和它的一个很大一部分显然是寄存器分配,其中临时变量与机器寄存器的有效匹配起来成为可能。上的结构诸如x86不会有太多的寄存器,以便有一些泄漏,其中变量必须被存储在存储器(栈)。有也存储在存储器中的变量,因为它们太大而不能在寄存器中。

在寄存器分配实际上再次调用到存储器中有效地分配中的变量,以便尽可能多的空间作为可能的共享。真正的问题是有没有办法约束寄存器分配放置两个变量在内存旁边对方(因为我就可以给它更大的变量作为许多较小的变量),并允许走动较小的变量分配器使得较大的变量可以适合,并且我不知道是否有任何周围的算法来处理这个问题,否则,我必须将存储器划分成不同的区域,不同尺寸的各保持变量。

下面是证明这样的示例:

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

有几个假设,使这里的例子的目的...这两个变量不优化掉,一旦C已被定义A和B都不再有用,所有的变量都分配到堆栈记忆。显然,我想“C”使用相同的存储器作为“一”和“b”只是使用并且因此仅分配8个字节,不过我的编译器的当前版本将分配一个完整的16个字节。

我的问题是,如何可以在不同尺寸的有效的存储器分配变量?

有帮助吗?

解决方案

显然,寄存器分配程序是不够的一般分配堆栈空间的,因为它没有意义在x86聚结相邻的寄存器-至少

为什么不展开它能够做到这一点?或者,更好的分频或子类它直接处理寄存器和堆栈分配。

作为用于堆叠分配器,它不是通常执行时间效率也不特别有效利用空间,以最小化(罕见)情况下使用的是两个变量可以共享相同的分配,由于非重叠范围堆栈。操作以分配和释放在范围过渡额外的堆栈空间是不太可能是值得的。即使在最关键的实时处理的,一个通常的方式比削去的堆栈空间的几个字节更感兴趣的鲁棒性和速度。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top