我正在为一个应用程序创建一个插件,其中应该由应用程序分配内存并跟踪它。因此,应该以缓冲区的形式从宿主应用程序获取内存句柄,然后将它们返回给应用程序。现在,我正计划使用STL Vectors,我想知道它在内部使用什么样的内存分配。
它是否在内部使用'new'和'delete'函数?如果是这样,我可以用自己的函数重载'new'和'delete'吗?或者我应该创建自己的模板分配器,这对我来说看起来很困难,因为我没有创建自定义模板的经验。
欢迎任何建议/示例代码。内存句柄可以从应用程序中获取,如
void* bufferH = NULL;
bufferH = MemReg()->New_Mem_Handle(size_of_buffer);
MemReg()->Dispose_Mem_Handle(bufferH); //Dispose it
答案 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 new
和operator 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)