以前一直以为字节对齐是个症结,平时的实际应用中接触的太多了,若是不去弄懂它,感受它就是一个短板,因而着手开始研究了它,今天在公司的例行讲解中又讲到了这个,回来想一想仍是整理下,算是给一个总结概括。
首先我不得不提一个预编译命令 #pragma pack(),为了更好的切入主题我暂且只关心#pragma pack(n)这种设置当前字节对齐值为n的用法,有一点必须注意,n只有等于1,2,4,8,16才是有效值,其它的设置都是无效的。
下面,我从结构体入手,先看一段代码布局
#include <stdio.h> #pragma pack (1) struct stu1 { int b; }; #pragma pack () struct stu2 { char a; struct stu1 b; }; int main() { printf("sizeof(struct stu1)=%d\nsizeof(struct stu2)=%d\n", sizeof(struct stu1),sizeof(struct stu2)); return 1; }
运行结果
1. 结构体内部,每一个变量至关于结构体首地址的偏移量的大小必须是这个变量类型的有效字节对齐值的整数倍。
2. 结构体自身,结构体分配内存的大小必须是结构体有效字节对齐值的整数倍。
好了,弄清楚了这些概念,咱们再开始看一段程序,来验证一下这些结论
spa
#include <stdio.h> #pragma pack (2) struct stu1 { char a; int b; }; #pragma pack () struct stu2 { char a; int b; }; int main() { printf("sizeof(struct stu1)=%d\nsizeof(struct stu2)=%d\n", sizeof(struct stu1),sizeof(struct stu2)); return 1; }
分析
变量 a b
stu1内存布局 *0 ****
code
stu2内存布局 *000 **** (*表示a、b的实际值,0表示为了字节对齐补的0值)内存