类,结构体,联合体内存大小分析

           int a;

           char b;

           double c;

           char d;

        };



int a从0偏移开始,占四个字节,即占用0,1,2,3,现在可用偏移为4偏移,接下来存char b; 由于4是1的倍数,故而,b占用4偏移,接下来可用偏移为5偏移,接下来该存double c; 由于5不是8的倍数,所以向后偏移5,6,7,都不是8的倍数,偏移到8时,8是8的倍数,故而c从8处开始存储,占用8,9,10,11,12,13,14,15偏移,现在可用偏移为16偏移,最后该存char d ;因为16是1的倍数,故d占用16偏移,接下来在整体向后偏移一位,现处于17偏移,min(默认对齐参数,类型最大字节数)=8;因为17不是8的倍数,所以继续向后偏移18…23都不是8的倍数,到24偏移处时,24为8的整数倍,故而,该结构体大小为24个字节。  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190815095922972.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FuZHJvaWRfY2h1bmh1aQ==,size_16,color_FFFFFF,t_70)



struct stu

{

char a; // 偏移位置0

int b;//偏移4

short c;//偏移8

};//最后为10补2,能整除4,所以为12

#pragma pack(2)

struct stu

{

char a;

int b;

short c;

};//8




2.  类  

    在C++11中,结构体和类已经没有区别,但



(1)含有虚函数的类需要注意。如果类含有虚函数或者从父类中继承虚函数,那么就会在类中建立虚函数表来存放虚函数地址,每个类有一个虚函数表,每个虚表有一个虚标指针指向相应虚表。  

所以带虚函数的类所占内存:成员对齐后大小 + 4\*(虚函数指针的个数n)。



class Base1{

virtual void fun1(){}

virtual void fun11(){}

public:

virtual ~Base1();

};

class Base2{

virtual void fun2(){}

};

class DerivedFromTwo: public Base1, public Base2

{

virtual void fun3(){}

};




DerivedFromTwo所占大小=4\*2。因为继承自两个虚函数类,会在类内部建立两个虚函数表,自己定义的虚函数是放在这两个虚函数表中的。



(2)静态成员  

因为静态成员在类外初始化,不占用类大小。  

空类的大小为1,因为C++规定任何对象不能有相同内存地址,如果大小为0,内存地址就出现相同的了。



class A

{

public:

void func() { cout << "stattuic"; }

const static int var;

static int var1;

}; //sizeof(A) == 1,类似空类

class A

{

public:

virtual void func() { cout << "stattuic"; }

const static int var;

static int var1;

};//sizeof(A) == 4,虚标指针大小




3.  联合体(Uion)



联合体又叫共用体,是指成员共用内存的偏移地址。所以共用体的内存为成员所占字节数的最大值,然后加上若干偏移值使得能够整除类型所占字节数的最大值。



![](https://img-blog.csdnimg.cn/img_convert/d8b6f25b59f6a3623013c82c63017918.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/a72fb0f02a52be66f8d136e013e60d69.png)




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值