对于创建一个类,需要多大的内存?
这其实是在考虑c++的对象的布局,在某本c++名著中,作者为了说明这一点,引入了几种模式,让我们主动思考,如果布局显得简单又高效。这些引入略过,直接进入主题。
(1).静态数据成员
(2).非静态数据成员
(3).静态成员函数
(4).非静态成员函数
(5).虚函数
(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个,看计算机的情况)
看到这里你可能想知道虚指针是如果使用虚函数表索引函数的吧,但是一个主题只讲一件事就行了。
我在前面的博客中写过不少c++的问题,其中提到多重继承,虚拟继承时,不管父类被继承多少次,在子类中的父类,其实都是同一个父类实例,也就是虚拟继承时,父类只有一份实例。子类继承了父类之后,它的内存和父类有重合,并且根据自己的数据成员有所扩展。
关于继承所需要注意的地方前面也写过了。