关于结构体的一些问题:
(1)、什么是结构体?
(2)、一般在什么情况下用到结构体?
(3)、什么是结构体内存对齐?为什么要对齐?怎样对齐?
(4)、对齐参数如何设置?可以设置为按照任意字节数对齐吗?
答:
(1)结构体是构造类型的一种,是一种根据自身需要,由基本数据类型组成的新的数据类型。
(2)在函数中需要返回多个值时,可以通过构建结构体达到目的;当基本数据类型,不能满足自身需要时,使用结构体组建自己的数据类型。
(3)
结构体内存对齐:元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每个元素放置到内存中时,它都会认为内存是按照自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始。
struct A
{
int a;
char b;
double c;
char d;
};
解析:
在windows系统32位平台上: int占4个字节 char占1个字节 float占4个字节 double占8个字节
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个字节。
(3.2)为什么要对齐
1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定 类型的数据,否则抛出硬件异常
2.硬件原因:经过内存对齐之后,CPU的内存访问速度大大提升。
(4)在windows中,VS编译器下,默认对齐数为8; 在Linux中,默认对齐数为4
设置对齐参数可在结构体struct之前加上#pragma pack(对齐数),在struct之后加上#pragma pack;便可以设置对齐参数。对齐参数不能任意设置,只能是内置类型已有的字节数,如:char(1)、short(2),int(4),double(8)…不能是3,5…任意数。