对象模型如何影响程序

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

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;
}
原文地址:https://www.cnblogs.com/boydfd/p/4983107.html