C++类所占空间总结

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


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


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


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


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值