对象模型如何影响程序

来源:互联网 发布:unity3d 重置动画状态 编辑:程序博客网 时间:2024/05/18 23:28

先看一下一个简单的函数:

X foobar(){    X xx;    X *px = new X;    xx.foo();    delete px;    return x;}

编译器做出的一些转换:

void foobar(X& _result){    //按原来的程序需要构造两个临时变量    //所以这里使用引用的方式来返回结果    //调用构造函数    _result.X::X();    //申请内存(其实就是operator new(size_t size))    px = _new(sizeof(X));    //如果申请内存成功就调用构造函数    if( px != 0)        px->X::X();    //这里就是成员函数的形式的转换,成员函数其实    //就是一个一般的函数,然后把this指针传入进去    //下面的foo 就是 foo(X* this);    foo(&_result);    //虚函数的基本调用方式,也就是通过vptr来调用    //vptr指向vtbl,然后直接用->符号即可访问vtbl    //然后下标2则可以访问到一个函数指针,所以调用    //就是这样(*xxx)(px) xxx就是取到的指针    //px就是this指针    (*px->vtbl[2])(px);    //同上,这是析构函数的多态使用,也需要    //检测指针不为空,因为c++提供一个保证    //就是对NULL进行delete不会出错    if( px != 0)    {        (*px->vtbl[1])(px);        _delete(px);    }    return;}
1 0