gpt4 book ai didi

c++ - int 可以别名为 unsigned int 吗?

转载 作者:太空狗 更新时间:2023-10-29 20:51:55 25 4
gpt4 key购买 nike

<分区>

编译器生成的代码假定 int 可以用 unsigned int 作为别名。以下代码:

int f(int& a, unsigned int& b){
a=10;
b=12;
return a;
}
int f(int& a, double& b){
a=10;
b=12;
return a;
}

使用 Clang5 生成以下程序集(类似代码由 GCC 或 ICC 生成):

f(int&, unsigned int&): # @f(int&, unsigned int&)
mov dword ptr [rdi], 10
mov dword ptr [rsi], 12
mov eax, dword ptr [rdi] #return value must be loaded since rdi might equal rsi
ret
f(int&, double&): # @f(int&, double&)
mov dword ptr [rdi], 10
movabs rax, 4622945017495814144
mov qword ptr [rsi], rax
mov eax, 10 #return value is a direct value.
ret

在上面的示例中,在第一个重载 f 中,返回值(在 eax 寄存器中)是 10 或 12 if b 并且a 指的是同一个对象。在第二次重载中,ab 不能引用同一个对象,因此返回值始终为 10。

严格的别名规则由C++标准的这段表达,[intro.object]/8 :

[...] Two objects a and b with overlapping lifetimes that are not bit-fields may have the same address if one is nested within the other, or if at least one is a base class subobject of zero size and they are of different types; otherwise, they have distinct addresses.

所以根据这个规则,int 不能被 unsigned int 别名。

问题:

  1. C++ 标准中是否存在允许 unsigned intint 别名的规则?

  2. 如果不是,为什么所有编译器都假设这种可能性?

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