【问题标题】:Second argument to std::vectorstd::vector 的第二个参数
【发布时间】:2010-12-14 08:02:51
【问题描述】:

看着vector,我意识到我在创建向量时从未使用过第二个参数。

std::vector<int> myInts; // this is what I usually do
std::vector<int, ???> myOtherInts; // but is there a second argument there?

看上面的链接说它是为了:

使用分配器对象而不是构造一个新的对象。

或者,至于this one

分配器:用于定义存储分配模型的分配器对象的类型。默认使用类型 T 的分配器类模板,它定义了最简单的内存分配模型,并且与值无关。

我想这与内存管理有关。但是,我不确定如何使用它。

关于这方面的任何指示?

【问题讨论】:

标签: c++ vector allocator


【解决方案1】:

默认分配器std::allocator&lt;&gt; 将处理由std::vector&lt;&gt;(和其他人)进行的所有分配。每次需要新分配时,它都会从堆中进行新分配。

通过提供自定义分配器,例如,您可以预先分配一大块内存,然后在需要单独分配时将其分割并分发较小的部分。这将显着提高分配速度,例如在游戏中这很好,但与默认分配器相比会增加复杂性。

一些std 类型的实现具有用于少量数据的内部基于堆栈的存储。例如,std::basic_string&lt;&gt; 可能使用所谓的小字符串优化,其中只有长度超过某个固定长度的字符串,比如 16 个字符(只是一个示例!),从分配器获取分配,否则使用了内部数组。

【讨论】:

  • 但是在std::vector&lt;int&gt; 中,ints 不是在堆栈上吗?
  • @Default - 没有。 std::vector(默认情况下)在堆上分配其存储空间。
  • @Default: 请看我关于小字符串优化的补充。
  • @Johann Gerell:谢谢。这是迄今为止最好的答案,如果有更多答案,我会将其打开更长的时间。
  • @Johann, @atzz: std::vector 默认情况下动态分配它的元素。无法保证此分配使用什么数据结构。
【解决方案2】:

一般情况下很少使用自定义分配器。一些有用的例子:

  • 针对特定分配模式的优化。例如,并发程序可以在任务执行开始时通过标准方式预先分配一大块内存,然后在不阻塞全局堆互斥体的情况下将其从内存中剔除。当任务完成时,整个内存块可以被释放。要将此技术用于 STL 容器,可以使用自定义分配器。

  • 嵌入式软件,其中设备具有多个具有不同属性(缓存/非缓存、快速/慢速、易失性/持久性等)的内存范围。自定义分配器可用于将存储在 STL 容器中的对象放置在特定的内存区域中。

【讨论】:

  • 所以基本上,我还不如忽略它,直到我需要担心内存管理:)
  • @Default - 基本上,是的。另一方面,在将 STL 容器模板作为 模板模板参数 传递给其他模板时,您可能必须考虑第二个参数的存在。但通常这也不是常见的情况。 :)
【解决方案3】:

也许这会有所帮助:http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079

你可以用谷歌搜索:stl allocator

【讨论】:

    【解决方案4】:

    Allocators (STL) 帮助您管理向量类中对象的内存。您可以将自定义分配器用于不同的内存模型(等)。

    【讨论】:

      【解决方案5】:

      您好,您可以找到自定义分配器的示例http://www.codeproject.com/KB/cpp/allocator.aspx

      【讨论】:

        猜你喜欢
        • 2011-12-27
        • 1970-01-01
        • 2013-09-29
        • 1970-01-01
        • 2021-01-17
        • 1970-01-01
        • 2018-07-02
        • 2018-11-19
        • 2016-07-23
        相关资源
        最近更新 更多