lk/include/compiler.h
#define __ALIGNED(x) __attribute__((aligned(x)))
#define __PACKED __attribute__((packed))

__attribute__((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐
__attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
字节对齐的作用不仅是便于cpu快速访问,同时合理的利用字节对齐可以有效地节省存储空间。

字节对齐单位,以下三者取最小的,就是实际对齐单位,结构体的大小必须为实际对齐单位的整数倍
a. linux 32位默认4字节对齐,64位默认8字节对齐
b. 结构体最大成员(基本数据类型)
c. 预编译指令 #pragma pack(n)手动设置,n-只能填1 2 4 8 16

#include <stdio.h>

//int占四个字节
int main()
{
//8 bytes
struct num1 {
char a;
short b;
int c;
};

//24 bytes
struct num2 {
char a;
short b;
int c;
char d[13];
};

//12 bytes
struct num3 {
short b;
int c;
char a;
};

printf("num1=%d\n", sizeof(struct num1));
printf("num2=%d\n", sizeof(struct num2));
printf("num3=%d\n", sizeof(struct num3));

return 0;
}

参考文章

  1. ​​C语言字节对齐详解 ​​