深度探索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)不管什么类型的指针(数组指针另当别论),该指针占用内存的大小是固定的(Linux下是8个字节)

示例:

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

猜你喜欢

转载自blog.csdn.net/qq_34805255/article/details/84310552