我一直在学习 C++,并且遇到了自定义内存分配器的主题。我了解到,通过设计一个分配器并将这个分配器与标准库容器一起使用,我们可以避免堆分配。此外,我们似乎可以避免内存碎片。这部分是通过使用placement new 和placement delete 操作符来实现的。
是否也可以在 C 中设计自定义内存分配器,以便我们可以控制内存分配并避免碎片?如果可能的话,C++ 是否只是简单地提供这种具有更高抽象级别的功能?
我一直在学习 C++,并且遇到了自定义内存分配器的主题。我了解到,通过设计一个分配器并将这个分配器与标准库容器一起使用,我们可以避免堆分配。此外,我们似乎可以避免内存碎片。这部分是通过使用placement new 和placement delete 操作符来实现的。
是否也可以在 C 中设计自定义内存分配器,以便我们可以控制内存分配并避免碎片?如果可能的话,C++ 是否只是简单地提供这种具有更高抽象级别的功能?
C 和 C++ 都是低魔法语言。C 尤其会在你背后分配很少的内存。例如,它可能对可变参数函数这样做,但几乎每个正常的数据结构都是由程序员显式分配的。如果调用malloc
,则使用默认堆。如果你调用别的东西,就会使用别的东西。
您始终可以编写自定义内存分配器和您自己的malloc
(类似于new
C++ 中的)和free
(可比较delete
)的实现。jemalloc是一个强调避免碎片的示例分配器。
C++ 使用std::allocator以更高级、更抽象的方式提供分配器
您可以分配一大块内存或声明一个巨大的数组,然后使用类似伙伴算法之类的东西作为自定义分配器。您需要做的就是#define malloc 并自由指向您的分配和释放例程。
如果你是 Windows 程序员,旧的 MFC 程序会有类似的东西
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
这重新定义了跟踪泄漏的调试版本。