Architecture 堆栈或全局数据(堆)-哪一个更适合将数据对象分配到寄存器

Architecture 堆栈或全局数据(堆)-哪一个更适合将数据对象分配到寄存器,architecture,computer-architecture,Architecture,Computer Architecture,当前的编程语言将数据存储在堆栈、全局数据区或堆中。在这种情况下,将数据对象分配到寄存器将是有效的,为什么?将数据分配到寄存器时有两个问题。编译器必须能够处理可能的别名,证明两个名称从不引用相同的数据,证明两个名称始终引用相同的数据,或者确定动态别名处理的成本是否低于寄存器分配的好处。编译器还必须估计在寄存器中保留数据的成本效益 (在加载存储指令集中,所有数据都分配到寄存器,尽管在某些情况下分配的时间很短。) 本地(堆栈)数据最容易分配到寄存器,因为它们的作用域相对有限(因此在它们的生命周期内分析

当前的编程语言将数据存储在堆栈、全局数据区或堆中。在这种情况下,将数据对象分配到寄存器将是有效的,为什么?

将数据分配到寄存器时有两个问题。编译器必须能够处理可能的别名,证明两个名称从不引用相同的数据,证明两个名称始终引用相同的数据,或者确定动态别名处理的成本是否低于寄存器分配的好处。编译器还必须估计在寄存器中保留数据的成本效益

(在加载存储指令集中,所有数据都分配到寄存器,尽管在某些情况下分配的时间很短。)

本地(堆栈)数据最容易分配到寄存器,因为它们的作用域相对有限(因此在它们的生命周期内分析使用更简单),而且它们通常很容易被证明不是别名

全局数据的别名分析通常比堆数据的别名分析困难,但其使用范围通常比堆栈数据的限制小,因此成本/效益分析更为困难。(在C语言中,“全局”的函数和文件静态数据具有本地化的作用域,使别名和成本/效益分析更简单。)

堆数据通常对别名分析最不友好(因为在类似C语言的代码中通常很难证明没有别名),对成本/效益分析也不友好(因为使用的限制比本地/堆栈数据少)