对齐方式和填充
今天有时间对alignment重新学习了一下,发现自己之前对alignment的理解是片面的。
?
alignment理解
?
alignment的含义可以分为两部分:
?
1.数据对齐,即这个对象的地址是多少的倍数。
?
int *p = (int *)malloc(sizeof(int));
?在32位机种这段代码中p的值就为8的倍数,因为malloc返回的值需要满足系统中所有的基本数据类型的对齐要求。
?
2.结构的数据填充。
?
typedef struct {char c;short sh;int word;}
?在默认alignment下这个结构中在c后面就会填充一个字节。因为short的alignment是2,所以会填充一个空字节,来达到short的alignment要求。
?
各种基础类型的alignment
?
char为1,short为2,int为4,long为4,long long为8。结构的alignment?为其所有元素的alignment的最大值。
?
#pragma pack(n)的理解
?
如果在程序中指定pack那么是不是所有元素的alignment就为n了呢?
答案是否定的。
在制定了pack(n)的时候,编译器确定alignment的方法是系统默认alignment和指定alignment的最小值,比如char的alignment仍为1,short的alignment为min(2,n)。
?
另外pack这条语句对malloc并没有任何影响,malloc返回值仍是满足系统中所有基本数据类型的对齐要求。那如果你需要malloc返回的地址有更大的alignment怎么办呢?
使用memalign。具体可以参考http://www.kernel.org/doc/man-pages/online/pages/man3/posix_memalign.3.html