一般的malloc实现,对一块已分配的内存,都有两个机器字的簿记,甚至更多。如果不需要排错,理论上讲,只需要一个字长的额外开销,用来记录这块内存的尺寸(放在intptr[-1]处是个好主意)。
为什么需要这个开销呢?因为free传入的只是个指针,它不知道要释放多大的内存,因此free内部必须通过某种方式来获得这块内存的尺寸。
可以想象,如果用 malloc/free 来作为一个关联数组(map)的分配器,要浪费不少内存。不过好在实际数据的尺寸往往比额外消耗要大很多,相比起来,浪费的比例不算很大,况且现在内存还很便宜。
其实,打造一个高效的分配器并不难,难的是它的适用范围(多线程?cell尺寸,chunk尺寸,对齐,排错...),如果可以忍受这些缺陷,或者说是限制,还是比较值得的。下一步就是它的灵活性——让它可以更加容易集成进其它系统。
对于C标准库,如果能增加一个/一族这样的分配器,还是很有价值的。从理论上讲,只要free时多传一个size参数,就可以完全去掉额外的开销。这样两个函数就可以做到:
这样做还有一个额外的好处,就是可以更好地对齐,假定程序需要按32字节对齐,malloc/free 就至少需要32字节做簿记,如果再加上内存越界检测,就需要64字节。salloc/sfree则只需要将分配的内存对齐到32字节边界即可。
但是这对程序的正确性要求很高,malloc/free中,内存越界检测可以很容易实现,而salloc/sfree就完全做不到(除非增加额外簿记)。一个好主意是可以在debug版中加入这些差错功能,而在release版中去掉。
更好(确切地讲应该是更灵活)的方案是,实现一个
而让 salloc/sfree简单地作为 mpool 的包装。
gcc的std::allocator基本上是按这样的方式实现的,只不过,它的size参数,大多数时刻是自动传递的(知道具体的class/struct,也就知道它的尺寸)。实现方式上,使用 size_aligned/align 作为索引去访问特定尺寸的mempool,一个 mempool 是多个链表串起来的大chunk,每个chunk内部是链表穿起来的cell。这也许是最好的实现方式了,除了节省的额外空间开销,时间开销上,如果不考虑加锁,一次alloc平均可以在10时钟周期内完成,dealloc用的时间更短。相比之下malloc/free耗的时间也要多得多。
分享到:
相关推荐
这种方法可以避免`malloc`在每次分配时的开销,减少对操作系统调用的依赖,同时通过控制内存块大小来减少碎片。`xmalloc`和`xfree`是这种内存分配策略的实现,它们通常提供更高效、更可控的内存管理机制。 `xmalloc...
在C语言中,`malloc`和`free`是两个非常重要的内存管理函数,它们用于动态地分配和释放内存。理解并能自己实现这两个函数对于深入理解C语言内存管理至关重要。`malloc`函数允许程序在运行时请求特定大小的内存块,而...
#### 一、new/delete、malloc/free 的关系与区别 **1. 基本概念与作用** - **new/delete**: 这两个是C++语言提供的运算符,用于在堆上动态分配内存并初始化对象,以及释放内存。 - **malloc/free**: 这两个是C/C++...
在内存管理方面,第七章介绍了多种内存分配方式,包括`malloc/free`和`new/delete`。内存分配错误是程序中常见的问题,例如内存泄漏、悬挂指针和双重释放等,这些错误可能导致程序崩溃或数据丢失。作者强调了识别和...
C语言实现的内存池!j利用默认的内存管理函数new/delete或malloc/free在堆上分配和释放内存会有一些额外的开销。
这是对malloc / free的直接替代,它是从头开始设计用于可伸缩服务器软件的。 为什么要使用另一个内存分配器? 这是分配器的优点: 它是线程友好的。 它支持几乎无限数量的并发线程,而不会导致锁定或性能下降。 ...
new/delete不仅分配和释放内存,还会调用对象的构造函数和析构函数,而malloc/free仅用于分配和释放内存。C++中引入new/delete,是因为它们能够处理对象的构造和析构,这是C语言中malloc/free所不具备的功能。 C++...
通过分析和学习自定义的`malloc`源码,我们可以深入了解内存管理的底层原理,这对于编写高性能、低开销的C程序非常有帮助。同时,这也是一种锻炼编程技巧和理解操作系统内存管理机制的好方法。理解`malloc`的工作...
3. **内存碎片**:频繁的`malloc()`和`free()`操作可能导致内存碎片,影响程序性能。合理规划内存使用和适时的内存整理有助于减少碎片。 4. **内存越界**:避免超出分配的内存范围访问,这可能导致程序崩溃或数据...
例如,动态内存分配函数malloc/free的实现可能需要优化,以减少开销并提高效率。此外,针对实时系统,可能需要采用更简单的内存分配策略,以避免虚拟内存导致的不确定性,但这也增加了开发的复杂性。因此,理解和...
14. **malloc/free 与 new/delete**:`malloc/free`是C风格的内存管理,而`new/delete`是C++的对象分配和释放。`new`能处理构造函数和析构函数,而`malloc/free`则不行。使用`new[]/delete[]`分配/释放数组内存。 ...
在用户空间中,经常需要通过`malloc`与`free`函数来进行动态内存的申请与释放,这些操作通常发生在进程的堆空间中。在嵌入式Linux系统中,Uclibc是非常流行的C库之一,它提供了轻量级且高效的内存管理功能。 #### ...
- 为了提高性能,现代的`malloc`实现通常会采用多种技术来减少内存分配和释放的时间开销。 - 包括使用缓存技术、多线程支持以及高效的内存管理算法等。 #### 五、结论 `malloc`作为C语言中动态内存分配的核心,...
如calloc()一次性初始化分配的内存,realloc()调整已分配内存的大小,或是使用内存池技术,预先分配一大块内存,按需切分给用户,以减少频繁的malloc()/free()操作带来的开销。 总的来说,malloc()及其...
6. **性能优化**:可能包含了对内存分配的优化策略,例如预分配、池分配等,以减少频繁的malloc和free调用带来的开销。 7. **内存对齐**:为了提高访问效率和兼容性,可能会确保内存分配满足特定的对齐要求。 8. *...
理解和掌握malloc和free的正确使用,以及如何检测和调试这些问题,是提高软件质量的关键。 通过深入学习malloc和内存池的运作机制,我们可以更好地理解程序在运行时如何管理内存,从而编写出更高效、更稳定的代码。...