赞
踩
ptmalloc:是Glibc(GNU C Library)中的内存分配器,它基于Doug Lea的malloc(dlmalloc)实现,主要用于用户态的内存分配。ptmalloc在Glibc中负责管理堆内存,包括malloc()
、calloc()
、realloc()
和free()
等函数的实现
void* malloc(size_t size);
它接收一个参数,即所需内存块的大小(以字节为单位),并返回一个指向分配内存区域的指针。如果内存分配失败,则返回NULL
。
malloc()
不能正确初始化对象。void* calloc(size_t num, size_t size);
它接收两个参数,分别为元素的数量和单个元素的大小,总共分配的内存大小为num * size
,并把分配到的内存初始化为0。
malloc()
一样不具备类型安全,不支持构造函数和析构函数。malloc()
或calloc()
分配的内存块的大小void* realloc(void* ptr, size_t new_size);
它接收两个参数,一个是已分配内存区域的指针,另一个是新的大小。如果成功,返回指向新大小内存区域的指针;如果失败,则返回NULL
,原来的内存区域保持不变。
realloc()
失败,原有的内存区域仍保留,但程序可能无法得知这一点。std::allocator
是STL容器(如std::vector
、std::list
等)默认使用的内存分配器模板类,它提供了一种类型安全的方式来分配和释放内存。template <class T>
class allocator
{
// 成员函数和类型声明...
};
使用std::allocator
分配内存时,通常间接通过STL容器完成,也可以直接实例化并调用成员函数来分配和释放内存。
std::allocator
会在分配内存的同时调用对象的构造函数,释放内存时调用析构函数。std::allocator
的默认实现基于operator new
和operator delete
,在某些特殊场景下(如高性能、低延迟或特定内存管理需求)可能不够优化。malloc()
和calloc()
是C语言层面的底层内存分配函数,灵活性强但安全性较低。realloc()
用于调整已分配内存的大小,方便动态扩展或缩小内存。std::allocator
是C++ STL中面向对象的内存分配器,提供类型安全和构造函数/析构函数的支持,适用于容器类的内存管理。std::allocator
是高层抽象,而malloc()
、calloc()
和realloc()
是更低层次的内存管理函数,直接操作内存。在C++中,除非有特殊需求,一般推荐使用STL容器和配套的内存管理设施jemalloc: 是是一种高性能、低碎片的内存分配器,最初由Jason Evans开发,现在被广泛应用于众多开源项目和商业产品中,如NetBSD、Mozilla Firefox、Facebook的HipHop Virtual Machine (HHVM)、Elasticsearch以及Redis等
tcmalloc:全称Thread-Caching Malloc,是由Google开发的一种内存分配器,专为多线程环境设计,同样致力于减少内存碎片和提高分配效率,特别关注于减少锁竞争和提升分配速度。
jemalloc和tcmalloc都是为了改进传统内存分配器(如ptmalloc,即glibc中的malloc实现)在多线程环境下的性能问题而设计的。二者在很多设计理念和技术细节上相似,但在具体的实现和优化策略上略有差异,适用于不同的场景和需求。在实际应用中,根据项目的特点和性能需求,开发者可以选择最适合的内存分配器。
brk/sbrk
brk() 是一个Unix/Linux系统调用,用于调整进程的数据段大小,即扩大或缩小进程的堆空间。调用 brk() 会改变进程的程序_break(program break),也就是堆的顶部位置。
void *brk(void *addr);
当传入参数为空指针时,brk() 会返回当前的程序断点;当传入一个新的地址时,它会尝试将程序断点移动到那个地址,如果成功则返回0,否则返回-1。
sbrk() 是brk()的一个库函数封装,提供了与brk()类似的接口,但更容易使用
void *sbrk(intptr_t increment);
sbrk() 接受一个增量值,调用时会将程序断点向前或向后移动指定的字节数,然后返回新的程序断点地址.
mmap/unmmap
mmap() 是一个Unix/Linux系统调用,用于将文件或者匿名内存映射到进程的地址空间中。它能够直接映射物理内存,不仅可以用于堆,还可以用于堆外内存分配。
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
mmap() 可以创建一个新的内存映射区域,或者扩展、修改已存在的映射区域。
munmap() 用于解除由mmap()创建的内存映射
int munmap(void *addr, size_t length);
kmalloc:
优点:
缺点:
vmalloc:
优点:
缺点:
kmalloc适用于需要小到中等大小且物理连续内存的场景,尤其是那些涉及直接内存访问操作的设备驱动。而vmalloc则更适合分配大块的、不一定要求物理连续的内存,用于内核自身的数据结构或者内存映射等情况。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。