对auto_ptr有研究的人进来,希望版主及在线高手关注一下

BlueDog 2009-05-13 08:46:47
以前没仔细看过auto_ptr的代码,今天仔细看了VS2003带的代码,有一个地方不是很了解,希望高手解惑

对于auto_ptr,VS2003实现了->的重载,它的具体代码如下:

_Ty *operator->() const _THROW0()
{ // return pointer to class object
return (&**this);
}


如果看汇编它是
00412033 mov ecx,dword ptr [this]
00412036 call std::auto_ptr<TEST>::operator* (411622h)

也很好理解,但是我不理解的是,为什么它不直接了当地
return _Myptr; // _Myptr 是auto_ptr的私有数据成员
这不是更简单?

各位高手可以发表一下自已的看法
...全文
96 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
jyh_baoding 2009-05-14
帮顶
  • 打赏
  • 举报
回复
jameshooo 2009-05-13
*this --> auto_ptr<_Ty>&
**this --> auto_ptr<_Ty>&::operator*() --> _Ty&
&**this --> &(_Ty&) --> _Ty*

后续的VC版本已经不再采用这种实现,而是直接返回get(),而get()中直接返回_Myptr。
  • 打赏
  • 举报
回复
biweilun 2009-05-13
你OD调下看看。return (&**this);只是一种思想的表示,虽然和返回*this没什么区别
00412036 call std::auto_ptr <TEST>::operator* (411622h)
这个充其量算是个类操作函数指针的地址,你到push ebp里看看子函数撒,看完了再说
  • 打赏
  • 举报
回复
BlueDog 2009-05-13
呵呵,的确不是真正的汇编,是调试窗口里的,不过很说明问题
  • 打赏
  • 举报
回复
biweilun 2009-05-13
我晕,你看的那能算是汇编么。充其量算是个伪汇编。
  • 打赏
  • 举报
回复
wocow3 2009-05-13
把VS2003中_Ty& operator*() const _THROW0()的代码贴下

或许调用operator*()时做了一些检查
  • 打赏
  • 举报
回复
BlueDog 2009-05-13
另外,大家在验证auto_ptr是否零地址一般都如何写
是不是写成

struct TEST
{
};

auto_ptr<TEST> pint(new TEST(2));

if(pint.get())
{
}
  • 打赏
  • 举报
回复
lyserver 2009-05-13
学习,并标记。
  • 打赏
  • 举报
回复
BlueDog 2009-05-13
不错,但是对于编译后,其实不存在什么类型的,因为成员变量也只是一个偏移值
  • 打赏
  • 举报
回复
healer_kx 2009-05-13
汇编无类型,
C++是有类型的。
同样的地址,却未必是同样类型的指针哦。
  • 打赏
  • 举报
回复
相关推荐
发帖
VC/MFC
加入

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
申请成为版主
帖子事件
创建了帖子
2009-05-13 08:46
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……