【发布时间】:2010-10-04 06:02:51
【问题描述】:
声明一个变量寄存器是对编译器的一个建议,如果可能的话,应该将特定的自动变量分配给 CPU 寄存器。
但是编译器如何决定何时将寄存器变量放入 CPU 寄存器?它使用哪种算法/机制来决定?
谢谢,
纳温
【问题讨论】:
标签: c
声明一个变量寄存器是对编译器的一个建议,如果可能的话,应该将特定的自动变量分配给 CPU 寄存器。
但是编译器如何决定何时将寄存器变量放入 CPU 寄存器?它使用哪种算法/机制来决定?
谢谢,
纳温
【问题讨论】:
标签: c
如果 Norman Ramsey 没有注意到这一点并回答,也许指向他的 papers 之一的指针就可以了。
图形着色主要用于静态编译器(也称为提前编译器)。对于动态(即时)编译器,您通常会使用能够更快获得结果的东西(例如,linear scan 算法),尽管它通常不会在寄存器分配方面做得那么好。
【讨论】:
正如 Jerry 所说,编译器使用寄存器分配器。寄存器分配是定义简单但很难解决的问题之一。
在过去,编译器感谢您帮助解决将哪些变量放入寄存器以及何时放入寄存器的问题。但是今天,任务更好理解了,编译器忙于程序分析,无法真正听你说什么。
除非完全关闭优化,否则您的编译器很可能会忽略 register 说明符。
【讨论】:
register 并完全关闭了优化?不要误会我的意思。我不是要争论这一点。这只是我(最近)没有看过的东西。
除了提到的那些,GCC(4.5.x+) 使用SSA-Tree based register allocator(更多细节在Passes section),虽然这里有一个很好的SSA register allocation示例
【讨论】:
您可以为变量指定寄存器关键字。但由编译器决定是否将其放入寄存器。通常在静态编译中使用图形着色来产生有效的分配。而在动态 (JIT) 编译中,首选称为线性扫描分配的方法,因为图形着色需要更多时间。
有向无环图 (DAG) 可用于生成最优指令序列(或最小寄存器分配序列)。
如需更深入的阅读,请参阅:1.Towards a More Principled Compiler:Register Allocation and Instruction Selection Revisited by David Ryan Koes
2。 Alfred V Aho 的《编译器设计原理》
【讨论】: