STL Vector默认使用'new'和'delete'进行内存分配吗?

时间:2010-11-11 21:53:10

标签: c++ memory stl vector allocation

我正在为一个应用程序创建一个插件,其中应该由应用程序分配内存并跟踪它。因此,应该以缓冲区的形式从宿主应用程序获取内存句柄,然后将它们返回给应用程序。现在,我正计划使用STL Vectors,我想知道它在内部使用什么样的内存分配。

它是否在内部使用'new'和'delete'函数?如果是这样,我可以用自己的函数重载'new'和'delete'吗?或者我应该创建自己的模板分配器,这对我来说看起来很困难,因为我没有创建自定义模板的经验。

欢迎任何建议/示例代码。内存句柄可以从应用程序中获取,如

void* bufferH = NULL;

bufferH = MemReg()->New_Mem_Handle(size_of_buffer);
MemReg()->Dispose_Mem_Handle(bufferH); //Dispose it

5 个答案:

答案 0 :(得分:18)

vector默认使用std::allocator,并且std::allocator需要使用全局运算符new(即::operator new(size_t))来获取内存(20.4.1.1)。但是,每次调用allocator::allocate时都不需要调用一次。

所以是的,如果你替换全局运算符new,那么vector将使用它,虽然不一定真正允许你的实现“有效地”管理内存。原则上,你想要使用的任何特殊技巧都可以通过std::allocator以10MB块的形式获取内存并进行子分配来完全无关。

如果您有一个特定的实现,您可以查看其vector的行为方式,如果您的计划分配策略本质上是特定于平台的,那么这可能就足够了。

答案 1 :(得分:6)

STL容器使用在构建时给出的分配器,default allocator使用operator newoperator delete

如果您发现默认设置不起作用,您可以提供符合容器要求的自定义分配器。引用了一些现实世界的例子here

我会首先使用默认值测量性能,并且仅在您确实需要时才进行优化。分配器抽象为您提供了一种相对简洁的微调方式,无需重新设计。如何使用vector可能会比基础分配器(reserve()提前产生更大的性能影响,避免在元素范围的中间插入和删除,有效地处理元素的复制构造 - 标准警告)。

答案 2 :(得分:3)

std::vector使用unitialized_*函数从原始内存构建其元素(使用placement new)。它使用创建的任何分配器来分配存储,默认情况下,该分配器直接使用::operator new(size_t)::operator delete(void *p)(即,不是特定类型的operator new)。

答案 3 :(得分:2)

来自this文章,“分配器的概念最初是为了提供不同内存模型的抽象来处理在某些16位操作系统上具有不同指针类型的问题(例如,near,far,等等)“......

“该标准提供了一个内部使用全局运算符'new'和'delete'”

的分配器

作者还指出了alocator界面并不那么可怕。正如Neil Buchanan所说,“亲自试试!”

答案 4 :(得分:2)

实际std::allocator已针对相当大的大小对象进行了优化。分配许多小物体并不是最好的,对许多大型物体来说也不是最好的。话虽如此,它也不是为多线程应用程序编写的。

我可以建议,在尝试自己编写之前,如果您要使用多线程路由,请查看Hoard分配器。 (或者您也可以查看同样吸引人的Intel TBB页面。)