首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解引用和按引用返回

解引用和按引用返回
EN

Stack Overflow用户
提问于 2013-05-09 14:07:39
回答 1查看 168关注 0票数 5

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

代码语言:javascript
运行
复制
struct A
{
   virtual void func(){}
   A& foo()
   {
     A *obj = reinterpret_cast<A*>(0xdeadbeef);
     return *obj; //1
   }
};

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

1行,它是实现定义的/未指定的,因为我们是通过引用返回的,并且如果没有显式访问指向的对象,程序不会崩溃?

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

谢谢

EN

回答 1

Stack Overflow用户

发布于 2013-05-09 16:03:30

我在MS VC8.0中反汇编代码,发现更有趣的事情:

代码语言:javascript
运行
复制
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寄存器。

代码语言:javascript
运行
复制
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是0xDeadBeans,并像临时局部变量一样推送到堆栈。然后调用复制构造函数(这是微不足道的)。

代码语言:javascript
运行
复制
        A *obj = reinterpret_cast<A*>(0xdeadbeef);
        A tmp ;
         temp = *obj;

即使这样也是可以的,因为operator=也是通过引用传递的,实际上传递的是您添加了成员变量的address.If,它将失败,因为它将尝试查找和复制成员。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16455462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档