2010-10-04 131 views
3

聲明一個變量寄存器是對編譯器的建議,如果可能的話,應該把特定的自動變量分配給CPU寄存器。在CPU寄存器中分配寄存器變量的標準?

但是編譯器如何決定何時把寄存器變量CPU寄存器?它使用哪種算法/機制來決定?

感謝,

納文

+0

該編譯器... – 2010-10-04 06:05:34

回答

5

如果諾曼拉姆齊沒有注意到這一點,並回答,也許是一個指向他papers之一將是秩序。

圖着色主要用於靜態編譯器(又名提前時間編譯器)。對於動態(準時)編譯器,你通常使用的東西,讓結果更快(例如,一個linear scan算法),即使它通常不會做的好寄存器分配的工作。

1

正如傑裏說,編譯器使用寄存器分配。寄存器分配是其中一個簡單定義的但困難的問題。

在過去的日子裏,編譯器非常感謝您幫助您解決將哪些變量放入寄存器以及何時放入寄存器的問題。但是今天,這個任務得到了更好的理解,編譯器也忙於程序分析,以便真正傾聽你所說的話。

除非優化完全關閉,你的編譯器很可能會忽略register符。

+0

你見過一個(合理)最近的編譯器,它注重'register'與優化?完全關閉?不要誤解我的意思。我並不是想說明這一點,這只是我最近沒有看過的東西。 – 2010-10-04 07:21:40

+0

@Jerry:GCC出於某種原因支持這一點。 – Potatoswatter 2010-10-04 15:24:57

+0

感謝您的信息 - 我沒有注意到這一點。 – 2010-10-04 15:37:29

1
從提到的那些

除此之外,GCC(4.5.x +)使用SSA-Tree based register allocator(在Passes section更詳細),雖然這裏是SSA register allocation

+0

SSA(樹或DAG)是包括大多數編譯器IR在內的語言類。所以大多數圖形着色分配器也將是SSA。 (幾年前我試圖配置/調整LLVM寄存器分配器用於學校項目......當時它絕對是「學術」代碼:vP。) – Potatoswatter 2010-10-04 17:55:50

0

一個很好的示例,您可以指定變量的register關鍵字。但是直到編譯器決定是否將它放入寄存器中。通常在靜態編譯圖中使用着色來產生有效的分配。而在動態(JIT)編譯中,稱爲線性掃描分配的方法是優選的,因爲圖着色花費更多時間。
向非循環圖(DAG)的可用於產生最佳的指令序列(或最小的寄存器分配序列)。
更徹底的閱讀看到:1. Towards a More Principled Compiler:Register Allocation and Instruction Selection Revisited by David Ryan Koes
2.由Alfred V阿霍編譯器設計原理