结构体对齐规则

本文详细解析了结构体对齐的四大规则,包括成员变量的对齐方式、嵌套结构体的对齐处理,以及在不同编译器环境下(如VS、Linux)的对齐数差异。通过具体实例,阐述了如何计算结构体的总大小,特别是在64位编译器下,考虑到指针占用空间的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结构体对齐的规则:

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的倍数)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值