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

问题描述 投票:0回答:1

总结的问题:

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

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

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

c gcc clang cpu-registers cpython
1个回答
0
投票

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

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

如果你必须对代码生成器进行反向工程,你真的可以用机器语言重写序列 - 至少有一本关于机器语言的手册,其中编译器黑客总是部落知识。你怎么知道用机器语言重写哪些位 - 再次查看分析器。

© www.soinside.com 2019 - 2024. All rights reserved.