在CPU寄存器中分配寄存器变量的条件?

在CPU寄存器中分配寄存器变量的条件?,c,C,声明变量寄存器是对编译器的一种建议,如果可能的话,应该将特定的自动变量分配给CPU寄存器 但编译器如何决定何时将寄存器变量放入CPU寄存器?它使用哪种算法/机制来决定 谢谢 纳文如果诺曼·拉姆齐没有注意到这一点并回答,也许可以用一个指针指向他的一个 图着色主要用于静态编译器(也称为超前编译器)。对于动态(即时)编译器,您通常会使用更快的结果(例如,算法),即使它通常不会很好地完成寄存器分配。正如Jerry所说,编译器使用寄存器分配器。寄存器分配是一个简单但困难的问题 在过去,编译器感谢您帮助解决

声明变量寄存器是对编译器的一种建议,如果可能的话,应该将特定的自动变量分配给CPU寄存器

但编译器如何决定何时将寄存器变量放入CPU寄存器?它使用哪种算法/机制来决定

谢谢


纳文

如果诺曼·拉姆齐没有注意到这一点并回答,也许可以用一个指针指向他的一个


图着色主要用于静态编译器(也称为超前编译器)。对于动态(即时)编译器,您通常会使用更快的结果(例如,算法),即使它通常不会很好地完成寄存器分配。

正如Jerry所说,编译器使用寄存器分配器。寄存器分配是一个简单但困难的问题

在过去,编译器感谢您帮助解决将哪些变量放入寄存器以及何时放入寄存器的问题。但是今天,这项任务被更好地理解了,编译器忙于程序分析,无法真正听你说什么


除非完全关闭优化,否则编译器很可能会忽略
寄存器
说明符。

除了上面提到的那些说明符之外,GCC(4.5.x+)使用一个(在中有更多详细信息),尽管这里有一个很好的示例,您可以为变量指定一个寄存器关键字。但是,由编译器决定是否将其放入寄存器。在静态编译中,通常使用图着色来产生有效的分配。而在动态(JIT)编译中,首选称为线性扫描分配的方法,因为图形着色需要更多时间。
有向无环图(DAG)可用于产生最佳指令序列(或最小寄存器分配序列)。

有关更详细的阅读,请参见:1.
2。Alfred V Aho的编译器设计原则

您是否看到(合理地)最近的编译器在完全关闭优化的情况下关注
寄存器
?别误会我。我不是在争论这一点;这是我(最近)没有看过的东西。@Jerry:GCC出于某种原因支持这一点。SSA(tree或DAG)是包括大多数编译器在内的语言类。所以大多数图着色分配器也是SSA。(几年前,我曾尝试为一个学校项目配置/调整LLVM注册分配器……当时它肯定是“学术”代码:vP。)