C++1y中的内存管理中的Sized Deallocation特性是什么?

8

提议在C++1y中加入Sized Deallocation功能。然而,我想了解它将如何影响/改善当前C++的底层内存管理?

该提议在N3778中,其中说明了其意图。

使用C++11,程序员可以定义一个静态成员函数operator delete,该函数接受一个大小参数,表示要删除的对象的大小。相应的全局operator delete不可用。这个遗漏带来了不幸的性能后果。 现代内存分配器通常按大小类别分配,并且出于空间效率原因,不会在对象附近存储对象的大小。因此,解除分配需要搜索包含对象的大小类别存储。这种搜索可能很昂贵,特别是因为搜索数据结构通常不在内存缓存中。解决方案是允许实现和程序员定义全局operator delete的大小版本。当有可用的大小版本时,编译器将优先调用大小版本而不是未调整大小的版本。
从上面的段落可以看出,operator delete需要维护大小信息,并通过使用的程序传递。这将避免在解除分配时搜索大小。但据我理解,在分配时,内存管理会将大小信息存储在某种头部中(在dlmalloc中解释了边界标记方法),这将在解除分配时使用。
T* p = new T();
// Now size information would be stored in the header
// *(char*)(p - 0x4) = size;
// This would be used when we delete the memory????.
delete p;

如果大小信息存储在头部中,为什么需要搜索才能释放内存? 看起来我错过了一些显而易见的东西,没有完全理解这些概念。
此外,在处理C++低级内存管理时,如何使用这个特性。希望有人能帮助我理解这些概念。

为了节省空间,出于效率考虑,在对象附近不存储对象的大小。他们正在讨论其他分配策略。 - dyp
1个回答

5
如您引用的那样,在现代内存分配器中,由于空间效率原因,不会在对象附近存储对象的大小。为了添加显式大小信息而增加每个分配的大小,显然会比其他替代方案使用更多的内存,例如在每个分配池中仅一次存储大小信息,或在释放时提供信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接