【发布时间】:2022-11-11 01:06:26
【问题描述】:
signed& 不能从 unsigned& 初始化(反之亦然),但严格的别名规则允许通过 unsigned& 读取/写入 signed 对象(反之亦然),请参阅 C++20 标准 @ 987654321@。如果不违反as-if rule,这理论上可以用于编译器优化。
示例 1。如果我是正确的,f 可以通过跳转到foo 来实现:
void foo(const unsigned&);
void f(const signed& par)
{
foo(par);
}
但是所有编译器都将par 加载到寄存器中,将寄存器存储在堆栈中,并将堆栈位置传递给foo。 Live demo。
示例 2。同样,我认为g1 和g2 可以指向相同的内存位置:
const signed& g1 = 1;
const unsigned& g2 = g1;
但是编译器倾向于分配两个不同的位置。 Live demo。
问题。这是为什么?这不是错过了优化的机会吗?
【问题讨论】:
标签: c++ compiler-optimization strict-aliasing as-if