首先你需要知道在什么情况下你才需要用到对齐与非对齐这个概念
typedef struct {
char* pCmd; //4个字节
char *pCmdPara; //4个字节
char isFree; //4个字节
}AT_QUEUE_ITEM_T;
AT_QUEUE_ITEM_T q[500] = {0}; //12*500 = 6000个字节
上面的代码 isFree 会应为对齐的原因填充成4个字节。所以原本只有9*500=4500个字节的数据,在这里硬生生变成了6000个字节,浪费了1500个字节。这对资源本就有限的单片机来说是致命的。
有没有解决方案呢?答案当然是有的。
#pragma pack(1) //强制一字节对齐
typedef struct {
char* pCmd; //4个字节
char *pCmdPara; //4个字节
char isFree; //1个字节
}AT_QUEUE_ITEM_T;
#pragma pack()
AT_QUEUE_ITEM_T q[500] = {0}; //9*500 = 4500个字节
这里我们使用 #pragma pack(n) 的预编译指令,将结构体强制1字节对齐。
如果用该结构声明的变量要作为参数传递入函数内部怎么办?
IAR 提供了 __packed属性
#pragma pack(1) //强制一字节对齐
typedef struct {
char* pCmd; //4个字节
char *pCmdPara; //4个字节