通过new
/ malloc
和allocator
进行内存分配有什么区别?
如果我们有new
和malloc
的选项,为什么我们需要一个单独的向量内存分配器?
答案 0 :(得分:2)
使用new或malloc时,内存管理与编译器运行时中的相应函数硬连线。相反,当使用分配器时,内存管理被委托给可交换的分配器。这允许您更改使用的内存管理功能。
有一些很好的理由可以实现这种额外的抽象和控制。例如见: Compelling examples of custom C++ STL allocators?
答案 1 :(得分:1)
嗯,我认为new
和malloc
不同,allocator
提供不同的功能。 malloc
返回未初始化的数据,calloc
返回零 -ed数据。但是,如果您要创建某个类的实例(new
,int
这些原始类型,bool
会调用构造函数,顺便说一句,也被初始化)。 delete
会调用析构函数,而free
则不会。
对于allocator
,它为用户提供了一个抽象层。 allocator
可以返回构造对象,非初始化内存空间,或者销毁对象或释放空间。 STL容器使用allocator
来获取内存空间并创建对象。
但请注意,由于可以使用自定义allocator
,因此allocator
不一定会管理new
/ delete
等内存。它可以创建大块内存然后执行一些分配缓存。它可以返回映射到磁盘上文件的区域中的内存地址,以便内部数据进入文件系统,因为它由上层容器修改。它也可以调用new
来获取内存。通过这种方式,allocator
使用户能够构建位于内存特定区域的容器。因此,对于allocator
s,容器的内部逻辑与内存存储的管理方式是分开的。
实际上,您可以编写一个派生自std::allocator
的类来实现上述每个功能。
您可能需要阅读this,了解有关allocator
的详细讨论。
答案 2 :(得分:0)
在allocator
课程中有一个allocate()
,其中包含以下两个参数:
pointer allocate (size_type n, allocator<void>::const_pointer hint=0);
根据引用of allocate(),通过提及您需要在指定的内存块旁边分配新的内存块,可以使用提示参数来提高性能。所以我相信使用提示你可以分配块,使得它们像数组一样是顺序的。
答案 3 :(得分:0)
分配器是内存管理器。例如,STL容器提供默认分配器,但是可以像本文中的解释那样自定义它们(STL分配器的教程):http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079/Allocators-STL.htm。