gpt4 book ai didi

c++ - 在优化期间别名有符号和无符号整数

转载 作者:行者123 更新时间:2023-12-05 03:16:55 27 4
gpt4 key购买 nike

signed& 不能从 unsigned& 初始化(反之亦然),但严格的别名规则允许读/写 signed 对象通过 unsigned&(反之亦然),参见 C++20 标准 [basic.lval]#11.2 .这理论上可以用于编译器优化,如果 as-if rule不违反。

示例 1. 如果我是正确的,f 可以通过跳转到 foo 来实现:

void foo(const unsigned& u);

void f(const signed& par)
{
foo(par);
}

但是所有编译器都将par加载到一个寄存器,将寄存器存储在堆栈上,并将堆栈位置传递给fooLive demo .

示例 2. 同样,我认为 g1g2 可以指向相同的内存位置:

const signed&   g1 = 1;
const unsigned& g2 = g1;

但是编译器倾向于分配两个不同的位置。 Live demo .

问题。这是为什么?这不是错失了优化机会吗?

最佳答案

const signed&   g1 = 1;
const unsigned& g2 = g1;

But compilers tend to allocate two different locations.

在这里,发生的事情是 g1 被转换为一个临时的 unsigned int 并且 g2 绑定(bind)到这个临时的。而C++保证不同的对象有不同的地址,所以g1g2需要分开存放。

与您的函数示例相同。关键是拥有不同的地址是一种可观察到的行为。这些函数可能依赖于它们的参数具有不同地址的事实,因为它们是对不同对象的引用。如果您的编译器将不同的对象合并到同一内存空间中,这种可观察到的行为将会改变,因此它不在 as-if 规则的范围内。

关于c++ - 在优化期间别名有符号和无符号整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74384754/

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