深度探索C++对象模型(1)——对象(1)

(1)一个类对象至少占用一个字节的内存空间,哪怕是一个空类

         为什么sizeof(空类)=1,而不等于0?

         因为该对象有内存地址,那么它至少占用一个字节,所以sizeof(void)=1

(2)类的成员函数不占用类对象的内存空间,虽然写在类当中,但不占用类的内存


结论:每个类的成员函数只声明一次,不随着对象而再次声明,跟着类走

(3) 非静态成员变量是占用对象的内存空间的

解释:这里的1其实是char类型的大小

 解释:这里的4为int类型的大小

 

当前C++对象模型:

(1)非静态的成员变量:跟着类对象走,存在对象内部,每个对象都有自己的成员变量

(2)静态成员变量:跟着类走,不占用对象的内存空间,保存在对象的外面

(3)成员函数(普通或静态):不管是静态的还是非静态的都跟着类走,保存在对象的外面,不管几个成员函数,都不占用类对象的内存空间

(4)虚函数:不管类有几个虚函数,都会多8个(编译器不同,大小不同,这里是在Linux下)字节

      为什么会多8个字节?

     解释:

     1.类中有几个虚函数,就会产生几个指向虚函数的指针

         而类产生的指针需要有地方存放,存放在一个表格当中,也就是“虚函数表”(vtbl)

         虚函数表保存在可执行文件中,在程序执行的时候载入到内存中来

         虚函数表是基于类的,跟着类走

     2.对于类对象而言,有了虚函数的存在,导致编译器会在适当的时机为类对象添加一个指针,这个指针正好指向虚函数表,

        许多资料把这个指针叫做“vptr”

(5)如果有多个数据成员,那么为了提高访问速度,某些编译器可能会将数据成员之间的内存占用比例进行调整

本应该是5个字节,而这里这里是8个字节,就是编译器进行了内存调整,也叫内存字节对齐

(6)不管什么类型的指针,该指针占用内存的大小是固定的(Visual Studio下为4个字节),此处注意数组指针和指针数组类型

示例:

只有普通成员变量m_value 和虚函数指针各占用8个字节,一共16个字节,大致关系图如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值