C++对象模型

C++中有两种数据成员:
  • 静态
  • 非静态
三种成员函数:
  • 静态
  • 非静态
  • 虚函数
C++对象模型内存布局如下:
  • 非静态数据成员在对象之内
  • 静态数据成员在对象之外
  • 静态、非静态成员函数在对象之外
  • 类中存在虚函数时,一个类对应一个virtual table(vtbl)放在对象之外,对象中安插一个指针vptr指向这个表。但vptr放在对象的什么位置上要视编译器而定。vptr的设置由构造、析构、赋值运算符函数自动完成。
C++对象模型如下图所示:

每个类相关联的信息由vtbl内的一个slot指出,用来支持RTTI机制。


测试例程:
#include <iostream>
 
using namespace std;
 
class A {
public:
    int x, y;
    static int s;
    void f1() { }
    static void f2() { }
    virtual void f3() { }
};
int A::s = 123;
 
int main()
{
    cout << "size = " << sizeof(A);
    return 0;
}

运行结果:
可以看出,对象所在内存中只包含有整型变量x、y、vptr,其它成员全部存在于对象之外。

下面讨论继承体系下的对象模型。下面这个测试例程有点意思:
#include <iostream>
 
using namespace std;
 
class A {
public:
    int x, y;
 
};
 
class B: public A {
};
 
class C: virtual public A {
};
 
int main()
{
    cout << "class B size = " << sizeof(B) << endl;
    cout << "class C size = " << sizeof(C) << endl;
    return 0;
}


运行结果:


类C采用了虚继承,内部就多了四字节。这是由于虚继承的特性决定的:在虚拟继承情况下,基类(虚基类)不管在继承链中被派生多少次,永远只会存在一个实例。和virtual table类似,也存在一个指针表(virtual base class table),表中每个指针指向一个虚基类地址,在对象中也安插一个指针指向这个表(微软的编译器就采用了这种做法)。所以类C才会增加了四字节空间。同时,基类(不管是不是虚基类)的数据成员直接被放置于派生类对象中。所以,class C所占空间为8+4=12字节。

如果有如下class:
class X {
public:
    virtual ~X()
    {}
 
    virtual void foo()
    {}
 
private:
    int a, b;
};

那么class X的模型应该如下所示:


环境:
Win7 + VS2013

参考:
《深度探索C++对象模型》 P9-P13.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值