时间:2021-05-19
malloc的默认行为
大家都知道C++中可以直接调用malloc请求内存被返回分配成功的内存指针,该指针指向的地址就是分配得到的内存的起始地址。比如下面的代码
int main(){ void *p = malloc(1024); printf("0x%p\n", p); free(p);}请求了一个大小为1024的内存块并打印出来,一切都很完美。
我们看看这块内存的地址。
可以看到,在64bit机器上,malloc默认行为会将分配的地址以16-byte对齐,如果我们想改变这种默认行为,提供32-byte或者64-byte对齐,应该怎么做呢?
实现aligned_malloc
源代码
从C++17开始,可以使用aligned_alloc函数达到这个目的,但是如果使用较老的C++版本,如C++14,C++11,我们需要手动写一个实现。
话不多说,先贴代码如下,aligned_malloc和aligned_free,需要配合使用,否则会有内存泄漏问题。
添加一个测试程序,
#include <assert.h>void TestAlignedMalloc(){ const int size = 100; const int alignment = 64; void* testArray[size]; for (int i = 0; i < size; ++i) { void * p = aligned_malloc(1024, alignment); assert((reinterpret_cast<size_t>(p) & (alignment - 1)) == 0); printf("0x%p\n", p); testArray[i] = p; } for (int i = 0; i < size; ++i) { aligned_free(testArray[i]); }}int main(){ TestAlignedMalloc(); return 0;}看看结果,
分配的内存地址都是以64-byte为边界,并且分配的内存最后也被成功释放了,函数是正确的。
源代码说明
本小段主要向不大了解解决思路的小伙伴做一些简单解释,程序大佬可以一笑而过哈。
首先我们要明确我们的解决方案,既然malloc分配的指针地址不能达到我们想要的字节对齐效果,我们就自己来调整这个指针。所以我们的做法是
这就是在C++中手动实现aligned_malloc的方法,希望大家在使用较老版本的C++的时候,有需要可以用上。如果使用的版本是C++17以上,那么还是推荐使用系统自带的方法。
到此这篇关于在C++中实现aligned_malloc的文章就介绍到这了,更多相关C++实现aligned_malloc内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
malloc/free和new/delete的区别malloc/free是C/C++标准库的函数;new/delete是C++操作符。malloc/free只是
C++中malloc()和free()函数的理解关于malloc和free这两个函数,malloc的用法示例:int*p=(int*)malloc(2*size
介绍1.malloc,free和new,delete区别。a.malloc,free是C/C++的标准库函数。new,delete是c++的操作符。b.mall
C++编程语言在程序开发应用中能够帮助我们轻松的完成许多功能需求。比如今天为大家介绍的C++获取文件大小的方法,就可以以多种方式轻松的实现。现在将会实现方法呈现
最近在学习C++,了解到,C++中对C做了扩充,使用结构体时也可以像类一样,规定私有数据类型和公有数据类型,同时也可以在struct中实现方法设置等等。但为了保