c++对象模型

对于创建一个类,需要多大的内存?

这其实是在考虑c++的对象的布局,在某本c++名著中,作者为了说明这一点,引入了几种模式,让我们主动思考,如何让布局显得简单又高效。这些引入略过,直接进入主题。

1.一个类应该有哪些成员?

(1).静态数据成员

(2).非静态数据成员

(3).静态成员函数

(4).非静态成员函数

(5).虚函数

2.布局.

(1).静态数据成员和静态成员函数和成员函数全都不在类的内部,它们被放置在其他地方。只有普通数据成员和虚函数表存在于类的布局之中。

(2).虚函数表在每一个对象中都存在,由应该虚指针指向它,这个指针的设定和重置是由constrcut,destructor,copy assignment完成。

案例:

class A{

        int a;

        char b;

        static float pi;

        virtual void fun1();

        virtual void fun2();

        void fun3();

        static void fun4();

  

};

这个类多大?

假设一个指针4个字节

答案是4+4+4 = 12;char虽然只要1个字节,但是需要考虑字节对齐。

a占4个,b占4个,virtual 指针占4个(或者8个,看计算机的情况)

看到这里你可能想知道虚指针是如果使用虚函数表索引函数的吧,但是一个主题只讲一件事就行了。

3.继承

我在前面的博客中写过不少c++的问题,其中提到多重继承,虚拟继承时,不管父类被继承多少次,在子类中的父类,其实都是同一个父类实例,也就是虚拟继承时,父类只有一份实例。子类继承了父类之后,它的内存和父类有重合,并且根据自己的数据成员有所扩展。

关于继承所需要注意的地方前面也写过了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值