字节对齐
原创
©著作权归作者所有:来自51CTO博客作者qq635f6f89e5645的原创作品,请联系作者获取转载授权,否则将追究法律责任
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;
}
参考文章
- C语言字节对齐详解