结构体对齐规则

结构体对齐的规则:

1.第一个成员在与结构体偏移量为0的地质处
2.其他成员变量要对其到某个数字(对齐数)的整数倍的地址处
         对齐数 = min{编译器默认的对齐数 ,该成员空间字节大小}(vs下为8, linux下为4)
3.结构体总大小为最大对齐数(每个成员都有一个对齐数)的整数倍
4.如果出现嵌套情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

例如:

1.下面的结构体大小分别是多大(假设32位机器)?
struct A 
{
    char a; //1
    char b; //1
    char c; //1
};
//进行整体对齐,最大类型为1<对齐系数4,按1整体对齐,所以1+1+1=3
变量空间首地址:0  1  2 

struct B 
{
    int a;  //4
    char b; //1
    short c;//2
};
//进行整体对齐,最大类型为4=对齐系数4,所以按4整体对齐4 1+2=3<4 对齐4 所以4+4=8 
变量空间首地址:0 4 6

struct C 
{
    char b; //1
    int a;  //4
    short c;//2
};
//进行整体对齐,最大类型为4=对齐系数4,所以按4整体对齐 1<4(对齐4) 4=4 2<4(对齐4)  所以4+4+4=12 
变量空间首地址:0 4 8

#pragma pack(2)
struct D 
{
    char b; //1
    int a;  //4
    short c;//2
};
//进行整体对齐,最大类型为4>对齐系数n(2),所以按2整体对齐 1<2(对齐2)4>2(2的倍数) 2=2 所以2+4+2=8 
变量空间首地址:0 2 6


2. 有一个如下的结构体:
struct A
{
     long a1;
     short a2;
     int a3;
     int *a4;
};
请问在64位编译器下用sizeof(struct A)计算出的大小是多少?
24
28
16
18

答案及解析:24
64位编译器下:指针8字节(一定不能忘记),题目不说默认4字节对齐
long  a1;     //8
short a2;     //2 8+2=10(不是4的倍数)对齐到4的倍数12
int   a3;     //4 4+12=16(4的倍数)
int  *a4;     //8 8+16=24(4的倍数)

 


版权声明:本文为qq_36612961原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。