C++1y 内存管理中的大小释放功能

Posted

技术标签:

【中文标题】C++1y 内存管理中的大小释放功能【英文标题】:Sized Deallocation Feature In Memory Management in C++1y 【发布时间】:2014-05-27 11:19:48 【问题描述】:

已提议将大小释放功能包含在 C++1y 中。但是我想了解它会如何影响/改进当前的 c++低级内存管理? p>

此提案在 N3778 中,其中陈述了此提案的意图。

使用C++11程序员可以定义一个静态成员函数操作符 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;

如果大小信息存储在标头中,为什么释放需要搜索它? 看起来我遗漏了一些明显的东西,并且没有完全理解这些概念。

此外,如何在程序中使用此功能,同时处理 C++ 中的低级内存管理。希望有人能帮助我理解这些概念。

【问题讨论】:

“而且,出于空间效率的考虑,不要将对象的大小存储在对象附近。” 他们在谈论其他分配策略。 【参考方案1】:

正如你的报价:

【现代内存分配器】出于空间效率的考虑,不要在对象附近存储对象的大小。

为了添加明确的大小信息而增加每个分配的大小显然会比其他方法使用更多的内存,例如每个分配池存储一次大小信息,或者在释放时提供信息。

【讨论】:

以上是关于C++1y 内存管理中的大小释放功能的主要内容,如果未能解决你的问题,请参考以下文章

ThreadX内核源码分析 - 动态内存管理

ThreadX内核源码分析 - 动态内存管理

解析PHP中的内存管理,PHP动态分配和释放内存

C语言进阶动态内存管理

C基础作用域和内存管理

C语言学习笔记(16)动态内存管理