2014-02-21 31 views

回答

0

向寄存器分配數據有兩個問題。編譯器必須能夠處理可能的別名,證明兩個名稱不會引用相同的數據,證明兩個名稱總是引用相同的數據,或者確定動態別名處理是否比寄存器分配的好處更便宜。編譯器還必須估算將數據保留在寄存器中的成本。

(在加載 - 存儲指令集,所有數據都被分配給寄存器,儘管在某些情況下在非常短的時間。)

本地(棧)的數據是最容易分配給寄存器,因爲它們的範圍相對有限(因此在其生命週期中分析使用更簡單),並且通常很容易證明它們不是別名。

對於全局數據的別名分析通常不如堆數據困難,但是使用範圍通常不如堆棧數據那樣受到限制,因此成本/收益分析更加困難。 (在C中,函數和文件靜態數據 - 它們是'全局'的 - 具有局部範圍使得別名和成本/收益分析更簡單。)

堆數據通常對於別名分析來說是最不友好的通常很難證明類似C語言的代碼不會出現混淆),並且對成本/收益分析不太友好(因爲使用比本地/堆棧數據的約束更少)。