C++类所占空间总结

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a3125504x/article/details/47839135

1.空类可以实例化,且所占空间为一。原因:编译器想为每个实例化对象分配一个独一无二的内存地址。


2.类中有虚函数,则无论类中有几个虚函数,类所占空间加4。原因:类中存放一个4字节的虚指针指向虚函数列表,虚指针存放在最开始的内存数据中,即在其他成员变量之前。(所有虚函数都在虚函数列表中,虚指针用来指定虚函数在虚函数列表中的入口,虚函数列表的每一项存储一个虚函数的地址);


3.类中的静态变量不占类的存储空间,非静态变量按对齐后的大小计算总值(默认对齐为4)。原因:静态变量存储在全局/静态变量区中,静态变量不属于任何一个类。


4.类的成员函数不占内存,类只是一个类型定义,不占内存,类的对象实例化后才占内存。但是都可以通过类/对象名查看所占内存大小。原因: (摘抄) 成员函数还是以一般的函数一样的存在。a.fun()是通过fun(a.this)来调用的。所谓成员函数只是在名义上是类里的。其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码。而我们访问类的成员函数是通过类里面的一个指针实现,而这个指针指向的是一个table,table里面记录的各个成员函数的地址(当然不同的编译可能略有不同的实现)。所以我们访问成员函数是间接获得地址的。所以这样也就增加了一定的时间开销,这也就是为什么我们提倡把一些简短的,调用频率高的函数声明为inline形式(内联函数)。


5.子类的大小,为自身非静态成员变量的大小加上父类的大小(与继承方式无关),在内存中,父类存储在子类之前。子类与父类共享一个虚指针,若父函数与子函数都有虚函数,则虚函数总大小为4。

展开阅读全文

没有更多推荐了,返回首页