对齐方式和填充

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值