已建议在C ++ 1y中包括大小调整分配功能。但是我想了解它如何影响/改善当前的c ++低级内存管理?
N3778中有此建议,其意图如下。
使用C ++ 11时,程序员可以定义一个静态成员函数运算符delete,该运算符带有一个size参数,该参数指示要删除的对象的大小。等效的全局运算符删除不可用。这种遗漏会带来不幸的性能后果。
现代内存分配器通常按大小类别进行分配,并且出于节省空间的原因,它们不将对象的大小存储在对象附近。然后,解除分配要求搜索包含对象的尺寸类别存储。这种搜索可能会很昂贵,特别是因为搜索数据结构通常不在内存缓存中。解决方案是允许实现和程序员定义全局运算符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 ++中的低级内存管理时如何在程序中使用此功能。希望有人能帮助我理解这些概念。
如您的报价:
[现代内存分配器]出于节省空间的原因,请勿将对象的大小存储在对象附近。
为了添加显式的大小信息,增加每个分配的大小显然会比其他选择(例如,每个分配池存储一次大小信息或在释放时提供信息)使用更多的内存。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句