5

new通过/malloc和分配内存有什么区别allocator

new如果我们有 和 的选项,为什么我们需要一个单独的内存分配器来分配向量malloc

4

4 回答 4

2

当您使用 new 或 malloc 时,内存管理硬连接到编译器运行时中的相应函数。相反,当使用分配器时,内存管理被委托给分配器,分配器是可交换的。这允许您更改使用的内存管理功能。

拥有这种额外级别的抽象和控制是有充分理由的。例如,请参阅: 自定义 C++ STL 分配器的引人注目的示例?.

于 2013-02-17T15:25:20.493 回答
1

呃,我认为newmalloc是不同的,allocator提供不同的功能。malloc返回未初始化的数据,并calloc返回数据。但是new,如果您正在创建某个类的实例(不是intbool这些原始类型,顺便说一下,它们也可以被初始化),则会调用构造函数。delete会调用析构函数,而free不会。

至于allocator,它为用户提供了一个抽象层。allocator可以返回构造的对象、未初始化的内存空间,或者销毁对象或释放空间。STL 容器用于allocator 获取内存空间和创建对象。

但请注意,由于allocator可以自定义, anallocator不一定像new/那样管理内存delete。它可以创建一大块内存然后做一些分配缓存它可以返回映射到磁盘上文件的区域中的内存地址,以便内部数据在被上层容器修改时进入文件系统。它也可以调用new来获取内存。通过这种方式,allocator使用户能够构建位于内存特定区域的容器。所以,有了allocators,容器的内部逻辑就和内存存储的管理方式分离了。

实际上,您可以编写一个派生类std::allocator来实现上述每个功能。


您可能想阅读这篇文章以获得关于 s 的更详细的讨论allocator

于 2013-02-17T15:22:13.117 回答
0

allocator类中有一个allocate(),它接受两个参数,如下所示:

pointer allocate (size_type n, allocator<void>::const_pointer hint=0);

根据allocate() 的参考,提示参数可用于通过提及您需要分配与指定内存相邻的新内存块来提高性能。所以我相信使用提示你可以分配块,使得它们像数组一样是连续的。

于 2013-02-17T15:25:55.803 回答
0

分配器是内存管理器。例如,STL 容器提供默认分配器,但可以按照本文(STL 分配器教程)中的说明自定义它们:http: //www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079 /分配器-STL.htm

于 2013-02-17T15:40:44.307 回答