gpt4 book ai didi

c++ - 别名和指针互换性

转载 作者:行者123 更新时间:2023-12-01 18:09:47 24 4
gpt4 key购买 nike

给出以下代码:

struct Tag {};
struct X {
// Tag t; // if not commented it shouldn't be pointer-interconvertible
int k;
};

int fn(const X& x, int& p) {
int i = x.k;
p = 2;
return i + x.k;
}

生成的代码是:

fn(X const&, int&):
mov eax, DWORD PTR [rdi]
mov DWORD PTR [rsi], 2
add eax, DWORD PTR [rdi]
ret

这里编译器假设存在别名。

如果成员t不存在,则类型Xint是指针可相互转换的。因此,编译器必须生成代码,就像引用可以别名一样。

但是,如果成员 t 存在,则它们不应再是指针可相互转换的,并且应生成非别名情况的代码。但在这两种情况下,除了成员k的相对地址之外,代码是相同的。

汇编器:

fn(X const&, int&):
mov eax, DWORD PTR [rdi+4]
mov DWORD PTR [rsi], 2
add eax, DWORD PTR [rdi+4]
ret

作为反例

template<typename T>
struct X {int k; };

int fn(X<struct A>& x, X<struct B>& p) {
int i = x.k;
p.k = 2;
return i + x.k;
}

在上面的版本中,生成的代码假设没有别名,但类型是指针可相互转换的。

fn(X<A>&, X<B>&):
mov eax, DWORD PTR [rdi]
mov DWORD PTR [rsi], 2
add eax, eax
ret

谁能解释一下吗?

最佳答案

这里

int fn(const X& x, int& p) {
int i = x.k;
p = 2;
return i + x.k;
}

编译器必须假设 p可能是对 x.k 的引用。两者px.kint 类型的左值。因此,它们可能会互相别名。是否Xint 可以进行指针互换或不改变这个事实:p可能是对 x.k 的引用.

这里

int fn(X<struct A>& x, X<struct B>& p) {
int i = x.k;
p.k = 2;
return i + x.k;
}

另一方面,X<struct A>X<struct B>是完全不相关的类型。 xp不能是对同一对象的引用。因此,x.kp.k不能表示同一个子对象。事实是X<struct A>以及 X<struct B>两者均可与 int 进行指针互换再说一遍,无关紧要……

关于c++ - 别名和指针互换性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59956427/

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