首页 > 编程语言 > 详细

C 语言结构体对齐

时间:2020-09-07 18:58:06      阅读:83      评论:0      收藏:0      [点我收藏+]

自然对齐规则:

1.数据成员对齐规则

在默认情况下,各成员变量存放的起始地址相对于结构的起始地址的偏移量sizeof(基本类型)或其倍数。如果该成员为非基本成员,则为其子成员中最大的基本类型的整数倍。

2.整体对齐规则

结构的总大小也有个约束条件:最大sizeof(基本类型)的整数倍。

 

为什么对齐?

CPU在一个时钟周期内存取数据,效率高。

 

typedef struct {
    short s1;   // +0; size = 2 bytes
}s;

sizeof(s) = 2

技术分享图片

 

 

 解释:

根据第一条规则起始位置是sizeof(s1)=2,0是2的倍数所以为sizeof(s) = 2。结构体总大小为子哦大sozeof(short)的整数倍。

 

typedef struct {
    int a;       // +0; size = 4 bytes
    double b;    // +8; size = 8 bytes
    short c;     // +16; size = 2 bytes
}s;

sizeof(s) = 24

技术分享图片

 

 

 解释:

sizeof(a) = 4,所以占0,1,2,3字节。

sizeof(b) = 8,起始位置必须是8的倍数。所以4,5,6,7字节需要填充。

b从8号字节处开始存储。

sizeof(c) = 2, 16是2的倍数,所以从16号字节处开始存储。

现在所占空间字节数只有4 + 4(填充字节) + 8 + 2 = 18。不符合最后一条规则。

所以需要将剩下的6个字节填充。

所以最终所占的字节数为 4 + 4(填充字节) + 8 + 2  + 6(填充字节) = 24。

 

typedef struct {
    char a;       // +0; size = 1 byte
    short b;      // +2; size = 2 bytes
    char c;       // +4; size = 1 byte
    int d;        // +8; size = 4 bytes
}s;

sizeof(s) = 12

技术分享图片

 

 

 解释:

sizeof(a) = 1,所以占起始的0号字节位。

sizeof(b) = 2,所以需要从2号字节开始占据。1号字节位则被填补。

sizeof(c) = 1,所以可以占据下一个字节也就是4号字节。

sizeof(d) = 4,所以起始地址必须为4的倍数,最近的四的倍数是8,所以前面的5,6,7被填补。

最后统计字节数为12,是最大类型int,sizeof(int) = 4的倍速。

所以最终所占的字节数为 :1 + 1(填充) + 2 + 1 + 3(填充) + 4  = 12。

 

typedef struct {
    char a;       // +0; size = 1 byte
    short b;      // +2; size = 2 bytes
    char c;       // +4; size = 1 byte
    int d;        // +8; size = 4 bytes
}s;

typedef struct {
    char c1;      // +0; size = 1 byte
    s s1;         // +4; size = 4 bytes
}k;

sizeof(s) = 12

sizeof(k) = 8

 

技术分享图片

解释:

sizeof(c1) = 1,所以占第一个字节。

s1中最大的类型的数据为int,所以s1要占四个字节。1,2,3则被填充。

所以最终所占的字节数为 :1 + 4(填充) + 4  = 8。

C 语言结构体对齐

原文:https://www.cnblogs.com/TNTBomb/p/13628302.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!