一、简介
在使用结构体的时候,经常要根据结构体的长度来进行相关判断。但是按照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字节。