关于结构体的一些问题

关于结构体的一些问题:

(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…任意数。

猜你喜欢

转载自blog.csdn.net/qq_33661910/article/details/86062284