为什么我们可以通过在C代码中重新分配变量来永久避免寄存器溢出?

时间:2019-04-23 16:39:19

标签: c gcc clang cpu-registers cpython

问题摘要:

  1. 我如何知道何时在C代码中重新分配变量以避免寄存器溢出?答案是否取决于目标计算机和编译器的CPU结构?
  2. 如果我在原始代码中添加了一些新变量,是否应该检查该行以避免寄存器溢出仍然有用?

在CPython中,我发现a line试图通过重新分配变量来避免寄存器溢出。该行的更改可以追溯到2015年创建的the commit。我对该行的原理感到好奇。

当用户运行Python时,有许多数据和代码正在加载到内存或寄存器中。如果更改了CPython代码的其他部分,为什么那行代码可以防止寄存器溢出呢? CPython不断建立在各种CPU架构和不同的操作系统上。为什么提交的注释中只提到了编译器的类型?

1 个答案:

答案 0 :(得分:0)

当代码生成器用尽了用于保存中间值和常用值的寄存器时,它会通过写入内存(通常是从堆栈分配的区域)来溢出寄存器。通常,这是一种低成本操作,并且高度依赖于CPU中的寄存器数量,提供给编译器的选项以及编译器本身的版本。

您应该努力编写清晰的代码,而不是对代码生成器进行反向工程。通常,代码生成器会通过生成非常好的代码来为此奖励您。当您遇到性能问题时,探查器应指导您找到需要重新访问的代码。通常在结构上或算法上进行改进。改进所生成代码的代码技巧通常围绕向编译器揭示信息。例如它认为动态的值实际上是静态的,或者安排数据结构以更好地利用缓存资源。

如果您必须对代码生成器进行反向工程,那么您还不妨用机器语言重写该序列-至少有一本关于机器语言的手册,其中编译器黑客始终都是部落知识。您如何知道要用机器语言重写的位,请再次查看分析器。