为了使CPU访问数据更加高效,编译器在编译程序时会自动进行对齐操作(GCC默认4字节对齐,windows VC默认8字节对齐),所谓对齐即让数据的首地址是数据长度的整数倍,如int 的长度是4 ,则其首地址应该能被4整除。
在程序编写的时候,若要强制数据结构对齐,有两种方式,一种方式是使用#pragma pack(n)规定对齐的大小,然后再用#pragma pack()恢复默认编译器字节对齐;一种方式是使用__attribute__((aligned(n))),但两者之间存在一定的区别。
关于结构体字节对齐的详细介绍请读者到http://www.cnblogs.com/dolphin0520/archive/2011/09/17/2179466.html阅读。本文只在这里做两种自定义对齐的区别分析。
首先上代码
#include <stdio.h> #pragma pack(4) //设置4字节对齐 struct test_struc{ char a; short b; char c; }; #pragma pack() //恢复编译器默认对齐 int main(void){ printf("size of test_struc:%d\n", sizeof(struct test_struc)); }
运行结果
# ./test size of test_struc:6
结果分析:
结构体test_struc中最长元素占长度为sizeof(short)=2 字节,
而#pragma pack(4)设置的4字节对齐,两者取较小者,所以结构体按2字节对齐,
char a ------------2字节
short b -----------2字节
char c ------------2字节
上代码
#include <stdio.h> struct test_struc{ char a; short b; char c; }__attribute__((aligned(4))); int main(void){ printf("size of test_struc:%d\n", sizeof(struct test_struc)); }
运行结果:
#./test size of test_struc:8
结果分析:
__attribute__((aligned(4)))是强制4字节对齐,不管结构体本身元素的最大大小是多少,结构体总体大小必须是 4的整数倍
char a --------------2字节
short b -------------2字节
char c ---------------4字节
原文:http://www.cnblogs.com/kekukele/p/3663020.html