赞
踩
在使用结构体的时候,经常要根据结构体的长度来进行相关判断。但是按照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字节。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。