类实例化对象及大小计算

类实例化对象:

  1. 类限定类有哪些成员,定义出一个类并没有分配实际的内存空间来存储,类似于我们建房的图纸
  2. 一个类可以实例化出多个对象,类实例化出的对象占用实际的物理空间存储类成员变量。对象就类似于我们实际建造出的房屋

类对象存储模型:


对象的大小计算:

是由成员变量决定的,由图我们可以看出每个对象都有不一样的成员变量来存各自不同的信息,但是却调用的是同一个成员函数,因此成员函数是存放在公共区域的,不参与计算,所以每个对象的大小为类中所有成员变量的大小之和,当然这里也遵循内存对齐原则。

那什么是内存对齐原则?

1.第一个成员在与结构体变量偏移量为0的地址处。
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
//对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8
gcc中的默认值为4
3.结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍。
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

为了便于理解在这里我们举个例子

class A
{
        char ch ;
        double d ;
};

ch为char类型占一个字节,用内存对其原则,在VS环境下,对齐数为8,ch在偏移量为0处,则往后数7个字节,又double为8个字节,那么VS下,这个类一共占16个字节,同理,LINUX下占12个字节

*为什么要内存对齐?

内存对齐是空间换时间,提高内存访问速度,因为cpu是一次访问整数倍数个字节,内存对齐后通过浪费几个自己可以达到简单快速的访问。

猜你喜欢

转载自blog.csdn.net/enjoymyselflzz/article/details/80981962
今日推荐