gpt4 book ai didi

compiler-construction - 是什么让值不安全地存储在寄存器中?

转载 作者:行者123 更新时间:2023-12-01 06:26:11 25 4
gpt4 key购买 nike

在谈论寄存器分配时,有关编译的文本(例如 Cooper 的 Engineering a Compiler)经常提到存储在寄存器中的值需要“安全”——否则它们应该存储在内存中。

是什么让值不安全地保存在寄存器中?

编辑:书中的上下文:

“在内存到内存模型中,分配器必须确定哪些值可以安全地保存在寄存器中——也就是说,哪些值是明确的。”

我能找到的最翔实的提及是
“寄存器提升使用指针值的数据流分析来确定何时可以在整个循环嵌套中安全地将基于指针的值保存在寄存器中,并重写代码以便将该值保存在新引入的临时变量中。”

所以要澄清这个问题:为什么将指针值存储在寄存器中是不安全的,这是唯一一种值不能安全地存储在寄存器中的情况吗?

最佳答案

我的理解是,这主要是 aliases 的问题。 .别名是两个或多个名称,它们在程序中的某个点引用同一个对象。

别名使得执行一些重要的优化变得非常困难。考虑以下 C 示例:

int first, second, *p, *q;
...
first = *p; // store the value from the variable referred to by p in first
*q = 3; // assign to the variable referred to by q
second = *p; // store the value from the variable referred to by p in second

first 的初始分配在大多数机器上,将需要 *p加载到寄存器中。由于访问内存的开销很大,编译器将希望保留加载的值,并在对 second 的赋值中重用它。 .但是,它将无法这样做,除非它可以验证 pq不要引用同一个对象(即 *p*q 不是别名)。

为验证某些名称不是别名而进行的分析称为 alias analysis ,并确定何时可以安全地将值缓存在寄存器中、“乱序”计算或由并发线程访问。

关于compiler-construction - 是什么让值不安全地存储在寄存器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28351654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com