首页 > 编程语言 > 详细

C++对象模型

时间:2014-06-03 09:56:10      阅读:368      评论:0      收藏:0      [点我收藏+]
C++对象模型内存布局例如以下:
  • 非静态数据成员在对象之内
  • 静态数据成员在对象之外
  • 静态、非静态成员函数在对象之外
  • 类中存在虚函数时,一个类相应一个virtual table放在对象之外,对象中安插一个指针vptr指向这个表。
測试例程:
#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;
}

执行结果:
bubuko.com,布布扣
能够看出,对象所在内存中仅仅包括有整型变量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;
}


执行结果:
bubuko.com,布布扣

类C採用了虚继承,内部就多了四字节。这是因为虚继承的特性决定的:在虚拟继承情况下,基类(虚基类)无论在继承链中被派生多少次,永远仅仅会存在一个实例。和virtual table类似,也存在一个指针表(virtual base class table),表中每一个指针指向一个虚基类地址,在对象中也安插一个指针指向这个表。所以类C才会添加了四字节空间。而在普通继承中,派生对象把基类对象包裹起来存放一块连续内存中,每一个类都有一份基类对象的实例。

环境:
Win7 + Code::Blocks

參考:
《深度探索C++对象模型》 P9-P13.

C++对象模型,布布扣,bubuko.com

C++对象模型

原文:http://www.cnblogs.com/mfrbuaa/p/3760473.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!