动态分配内存返回地址对齐的指针
2016-01-21 17:14
197 查看
今天在调用一个引擎接口的时候,发现要求传入的资源地址要按照16位对齐,即地址值要能被16位整除,资源地址是把资源文件加载到内存的首地址,使用malloc按照资源文件的长度分配,malloc返回的地址不一定满足按照16位对齐,从网上找的一个方法:
原文应用地址:/article/9655184.html
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整除的数字
原文应用地址:/article/9655184.html
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整除的数字
相关文章推荐
- 正益移动:不仅仅送给你软件生产线
- 最近一百年,全球涌现过哪些最顶尖的、最赚钱的公司?它们的共性是什么?
- 简单说明Oracle数据库中对死锁的查询及解决方法
- Sublime Text3—软件安装、package control插件管理
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
- 联系人 表
- getHibernateTemplate()与getSession()的区别
- 安全驾驶-锁车门(三十二)
- 计数单位-科学计数法
- 讲解 Spark API 最好的资料
- Windows Embedded Compact 实时调度介绍
- makefile "="和“:=”的区别
- Android开发记录20-获取缓存大小和清除缓存功能
- Sql Server性能调试方法
- Home键屏蔽
- geoserver 的缓存技术
- servlet servlet请求与响应
- duplicate symbols for architecture x86_64
- new\new[]\delete\delete[]区别
- 0121 --view 可以当作线