`
jfwang213
  • 浏览: 10354 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

对齐方式和填充

阅读更多

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics