何时进行混叠

When to assume aliasing

本文关键字:何时进      更新时间:2023-10-16

我正在复习关于严格别名的知识,我偶然发现了一篇著名的文章:什么是严格别名规则,我们为什么在乎?

signed int foo( const signed int &si1, int &si2); // Hard to show this one assumes aliasing

但我在理解这句话时遇到了问题:"很难显示这个假设是混叠的"。在这种情况下,这意味着什么?我觉得这些语句想指出si1si2可能(也可能不(引用同一个对象?但我不确定。

请参阅上面关于的示例

signed int foo( signed int &si, unsigned int &ui ) { 

在解释中,您可以从编译器的输出中看到优化器确实假设存在混叠。

列表中的所有示例都是编译器必须"假定别名"的情况,因为这些项是允许别名的项。在"//很难显示这个假设有别名"中,作者只是说,从编译器的输出中,与之前的例子相比,不容易看出这种情况。

我觉得这些语句想指出si1和si2可能(也可能不(引用同一个对象?

列表中的所有项目都是这样。这是一个特殊情况列表,允许不同类型的变量引用同一对象。该语句是关于如何在编译器输出中看到规则的效果。

换句话说:一般情况下,倾斜是不允许的。因此,编译器可以安全地假设不同类型的指针或引用不引用同一对象。优化器一直都是这样做的:它假设您编写的代码符合规则。然后,它将转换应用于代码,从而产生完全相同的可观察行为。这一切都是在您编写了有效代码的假设下进行的。在这种情况下,编译器必须更加谨慎,因为列出的异常给了您更多的自由,而给了优化器更少的自由。现在,它不能假设两个不同类型的引用从不引用同一个对象,而是必须"假设存在别名"(这略微限制了优化的可能性(。