首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

对齐模式和填充

2012-09-16 
对齐方式和填充今天有时间对alignment重新学习了一下,发现自己之前对alignment的理解是片面的。?alignment

对齐方式和填充

今天有时间对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

热点排行