【问题标题】:How to get rid of (one) unnecessary copy when constructing a vector?构造向量时如何摆脱(一个)不必要的副本?
【发布时间】:2017-10-23 15:38:09
【问题描述】:

我有一个class A 来处理我的资源(相当大)。现在我需要这些std::vector<A> vec_of_A (3, A(int N)) 的向量。问题是vector 首先构造临时对象A(int N),然后从该对象复制构造三次,然后销毁该临时对象。由于我的 A(int N) 分配了相当大的内存块,我最终(暂时)的内存需求比我实际需要的大 33%。

如何构造Avector,同时避免不必要的构造函数? (我的class A 满足所有五项规则)。

编辑:抱歉,我没有意识到默认构造对象 A 的重要性。我的问题不是关于默认构造函数而是参数化构造函数。

【问题讨论】:

  • 您始终可以将 A* 存储在数据结构中。
  • 您的代码 sn-p 是否具有指示性?您是否默认构造 A 参数?
  • @PhilipBrack 如果没有使用指针的具体理由,那 [ahem] 毫无意义。如果值语义适用于 OP,那么为(更多)动态分配和间接分配额外的开销是没有用的。毕竟,指向的As 仍然需要构建......
  • 我希望人们在发帖后能在网上停留几分钟以进行澄清。发布的三个非常好的答案可能会在一秒钟内因迟来的“不”而失效。
  • @Quentin - 我仍然对这一切的原则感到愤怒。我有一种感觉可能是这种情况,这就是我要求澄清的原因。

标签: c++ c++11 vector temporary-objects


【解决方案1】:

如果你只想默认构造向量中的对象,你可以使用

std::vector<A> vec_of_A(some_number);

这将创建some_number 默认项。

如果项目不是默认可构造的,那么reserve 是您需要的空间,然后使用emplace_back 在适当位置构造元素。看起来像

std::vector<A> vec_of_A;
vec_of_A.reserve(some_number);
for (int i = 0; i < some_number; ++i)
    vec_of_A.emplace_back(/*constructor parameter(s) here */); // construct an object

【讨论】:

    【解决方案2】:

    使用 std::vector::resize() 方法用 3 个不需要从初始临时对象复制的默认构造项填充向量:

    std::vector<A> vec_of_A;
    vec_of_A.resize(3);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多