今天在调用一个引擎接口的时候,发现要求传入的资源地址要按照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整除