C语言:__attribute__((packed))

一、简介

        在使用结构体的时候,经常要根据结构体的长度来进行相关判断。但是按照C语言的规则,会对不同类型的数据类型进行自动对齐。有时候就会造成一些问题,如果不需要使用自动对齐的功能,就需要使用到本章的关键字。

二、自动对齐

        先看下面这段代码

typedef struct 
{
    uint32_t c;
    uint8_t a1; 
}test_data1;

typedef struct 
{
    uint16_t b;
    uint8_t a1;
}test_data2;

void main(void)
{
    LOG_I(TAG,"test_data 1 sizeof:%d",sizeof(test_data1));
    LOG_I(TAG,"test_data 2 sizeof:%d",sizeof(test_data2));
}

        看结果:

        可以看到系统对data1和data2都进行了自动对齐,对齐的方式根据结构体第一个元素来区分。data1按照uint32_t的4字节进行对齐。data2按照uint16_t的2字节对齐。所以,data1占8个字节,data2占4个字节。

三、取消自动对齐

         看如下代码

typedef struct 
{
    uint32_t c;
    uint8_t a1; 
}__attribute__((packed)) test_data3;

typedef struct 
{
    uint16_t b;
    uint8_t a1;
}__attribute__((packed)) test_data4;

void main(void)
{
    LOG_I(TAG,"test_data 3 sizeof:%d",sizeof(test_data3));
    LOG_I(TAG,"test_data 4 sizeof:%d",sizeof(test_data4));
}

        看结果:

        可以看到__attribute__((packed))关键字取消了结构体的自动对齐,data3占5字节,data4占3字节。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值