考虑一个小的单元测试用例
struct A
{
virtual void func(){}
A& foo()
{
A *obj = reinterpret_cast<A*>(0xdeadbeef);
return *obj; //1
}
};
int main()
{
A obj = obj.foo();
}在1行,它是实现定义的/未指定的,因为我们是通过引用返回的,并且如果没有显式访问指向的对象,程序不会崩溃?
我和我的一个同事争论过,他提到在大多数情况下,编译器会优化obj的解引用,因为我们是通过引用返回它的,并且这段代码不会崩溃?
谢谢
发布于 2013-05-09 16:03:30
我在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是0xDeadBeans,并像临时局部变量一样推送到堆栈。然后调用复制构造函数(这是微不足道的)。
A *obj = reinterpret_cast<A*>(0xdeadbeef);
A tmp ;
temp = *obj;即使这样也是可以的,因为operator=也是通过引用传递的,实际上传递的是您添加了成员变量的address.If,它将失败,因为它将尝试查找和复制成员。
https://stackoverflow.com/questions/16455462
复制相似问题