提议在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++低级内存管理时,如何使用这个特性。希望有人能帮助我理解这些概念。