动态分配内存返回地址对齐的指针

今天在调用一个引擎接口的时候,发现要求传入的资源地址要按照16位对齐,即地址值要能被16位整除,资源地址是把资源文件加载到内存的首地址,使用malloc按照资源文件的长度分配,malloc返回的地址不一定满足按照16位对齐,从网上找的一个方法:
原文应用地址:http://blog.csdn.net/typhoonzb/article/details/4732520
int mallocedMemory = (int )malloc(1024+15);
alignedMemory = (int *)(((int)mallocedMemory + 15) & ~15);
((void **)alignedMemory)[-1] = mallocedMemory;
return alignedMemory;
+15 而不是 +16的原因
例: 地址 0x00 + 15 变成 0x0F,通过& ~15,还是变为0x00,这样本身一个16字节对齐的地址就不会浪费16个字节了
地址 0x00 + 16 变成 0x10,通过& ~15,还是变为0x10,这样本身一个16字节对齐的地址就会浪费16个字节
((void **)alignedMemory)[-1] = mallocedMemory目的是存放mallocedMemory的地址,放在返回指针的前面一个地址

//
基本思想是如果要获取一个能被N整除的数,只需要在任意大于0的自然数M加上N-1即可,然后从M到M+N-1中找到能被16整除的数字

通过& ~15操作其实就是把低4位置为0,第5位为2的四次方,第6位为2的5次方均能被16位整除,所以只要将低4位置为0就能被16整除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值