Man*_*mar 8 memory-management dynamic-memory-allocation c++11 c++14
已经提出将大小的释放特征包括在C++ 1y中.但是我想了解它将如何影响/改进当前的c ++ 低级内存管理?
对于C++ 11,程序员可以定义一个静态成员函数operator delete,它接受一个size参数来指示要删除的对象的大小.等效的全局运算符删除不可用.这种遗漏带来了不幸的性能后果.
现代内存分配器通常在大小类别中进行分配,并且出于空间效率的原因,不要将对象的大小存储在对象附近.然后,取消分配需要搜索包含该对象的大小类别存储.这种搜索可能很昂贵,特别是因为搜索数据结构通常不在内存缓存中.解决方案是允许实现和程序员定义全局运算符delete的大小版本.当大小版本可用时,编译器应优先调用大小不同的版本.
从上面的段落看,它看起来像操作员删除所需的大小信息可以保持并因此通过使用的程序传递.这将避免在重新分配时搜索大小.但是根据我的理解,在分配时,内存管理将大小信息存储在某种标题中(在dlmalloc中解释为boundary-tag方法),这将在解除分配时使用.
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;
Run Code Online (Sandbox Code Playgroud)
如果大小信息存储在标题中,为什么重新分配需要搜索它?看起来我错过了一些显而易见的东西,完全不理解这个概念.
此外,在处理C++中的低级内存管理时,如何在程序中使用此功能.希望有人能帮我理解这些概念.
如你的报价所示:
[现代内存分配器]出于空间效率的原因,不要将对象的大小存储在对象附近.
为了添加显式大小信息,增加每个分配的大小显然将使用比诸如每个分配池一次存储大小信息或在重新分配时提供信息的替代方案更多的存储器.
归档时间: |
|
查看次数: |
2322 次 |
最近记录: |