C数据类型字节对齐

24 篇文章 3 订阅
3 篇文章 0 订阅

0 前言

        需要字节对齐的根本原因在于CPU访问数组数据的效率问题 ,对于标准数据类型,它的地址只要是它的长度的整数倍就行了,而非标准数据类型按下面的原则对齐:

    数组 :按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。 

    联合 :按其包含的长度最大的数据类型对齐。 

    结构体: 结构体中每个数据类型都要对齐。

    本文重点分析结构体的对齐方式。

1 结构体

1.1 案例1

struct A { 
    char a;  // 1字节对齐
    int b;   // 4字节对齐
    short c; // 2字节对齐
} a;         // 由于本结构体最大的成员是4字节对齐,因此本结构体整体以4字节对齐

    字节对齐情况:

sizeof(A) = 12; // struct A以4字节对齐,因此后面补充两个字节
&a.a = 0;
&a.b = 4;       // 地址4字节对齐
&a.c = 8;

1.2 案例2

struct A { 
    char a;    // 1字节对齐
    short b;   // 2字节对齐
    int c;     // 4字节对齐
};

   字节对齐情况:

sizeof(A) = 8;
&a.a = 0;
&a.b = 2;   // 地址2字节对齐
&a.c = 4;   // 地址4字节对齐

2 压缩

        gcc/g++可通过__attribute__((packed))设置对齐方法:

#include <stdint.h>

struct A {
    uint16_t cmd;
    uint32_t size;
} __attribute__ ((packed));

int main(void)
{
    printf("sizeof(A) = %d\n", sizeof(A));
}

    如上所示,添加了__attribute__((packed))后,A占用的空间为6字节,而不是8字节。

参考资料

[1]C语言字节对齐

[2]5分钟搞定内存字节对齐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneSea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值