gpt4 book ai didi

c++ - 取消引用并通过引用返回

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:28 24 4
gpt4 key购买 nike

考虑一个小的单元测试用例

struct A
{
virtual void func(){}
A& foo()
{
A *obj = reinterpret_cast<A*>(0xdeadbeef);
return *obj; //1
}
};

int main()
{
A obj = obj.foo();
}

在第 1 行,是否定义/未指定实现是否在我们通过引用返回时不会发生遵从,如果未对指向的对象进行显式访问,程序也不会崩溃?

我和我的一位同事争论过,他提到编译器在大多数情况下会优化 obj 的取消引用,因为我们通过引用返回它并且这段代码不会崩溃?

谢谢

最佳答案

我在 MS VC8.0 中反汇编了代码,发现了一些更有趣的东西:

006D48D6  mov         dword ptr [ebp-8],ecx 
A *obj = reinterpret_cast<A*>(0xdeadbeef);
006D48D9 mov dword ptr [obj],0DEADBEEFh
return *obj; //1
006D48E0 mov eax,dword ptr [obj] //2
}
006D48E3 mov esp,ebp
006D48E5 pop ebp
006D48E6 ret

//2表示将obj的地址作为返回值放入eax寄存器即可。

006D39FC  lea         ecx,[ebp-190h] 
006D3A02 call A::foo (6A8C12h)
006D3A07 push eax //3
006D3A08 lea ecx,[ebp-190h]
006D3A0E call A::A (6B89BEh)

eax 是 0xdeadbeef,并像临时局部变量一样压入堆栈。比我们调用复制构造函数(这是微不足道的)。所有这些操作只是传递地址(这是非法的,但程序不关心)。因为 A 结构没有任何绑定(bind)到特定对象的成员,如果没有,程序将不会尝试通过解引用来查找特定对象t need.So this bomb have not been fired.

        A *obj = reinterpret_cast<A*>(0xdeadbeef);
A tmp ;
temp = *obj;

即使这样也没关系,因为 operator= 也是通过引用传递的,实际上传递的是地址。如果添加成员变量,它将失败,因为它会尝试查找并复制该成员。

关于c++ - 取消引用并通过引用返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16455462/

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