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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**