当前位置:   article > 正文

C语言:__attribute__((packed))

C语言:__attribute__((packed))

一、简介

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

二、自动对齐

        先看下面这段代码

  1. typedef struct
  2. {
  3. uint32_t c;
  4. uint8_t a1;
  5. }test_data1;
  6. typedef struct
  7. {
  8. uint16_t b;
  9. uint8_t a1;
  10. }test_data2;
  11. void main(void)
  12. {
  13. LOG_I(TAG,"test_data 1 sizeof:%d",sizeof(test_data1));
  14. LOG_I(TAG,"test_data 2 sizeof:%d",sizeof(test_data2));
  15. }

        看结果:

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

三、取消自动对齐

         看如下代码

  1. typedef struct
  2. {
  3. uint32_t c;
  4. uint8_t a1;
  5. }__attribute__((packed)) test_data3;
  6. typedef struct
  7. {
  8. uint16_t b;
  9. uint8_t a1;
  10. }__attribute__((packed)) test_data4;
  11. void main(void)
  12. {
  13. LOG_I(TAG,"test_data 3 sizeof:%d",sizeof(test_data3));
  14. LOG_I(TAG,"test_data 4 sizeof:%d",sizeof(test_data4));
  15. }

        看结果:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/563074
推荐阅读
  

闽ICP备14008679号