【问题标题】:STL copy efficencySTL 复制效率
【发布时间】:2012-05-20 12:47:17
【问题描述】:

我的理解是std::copy 一次复制一个元素。为了触发每个元素的构造函数,这似乎是必要的。但是当不存在这样的构造函数时(例如 POD),我认为memcpy 会更有效。

那么,STL 是否需要/允许专门化,例如,vector<int> 复制只会执行 memcpy
我希望为 GCC / MSVC 回答以下问题,因为这些是我使用的编译器。

  1. 如果允许但不是必需的,上面的编译器是否真的做到了?
  2. 如果这样做,会触发哪些容器?显然list 没有意义,但是stringdeque 呢?
  3. 同样,如果他们这样做,哪些包含的类型会触发这个?只有内置类型,还是我自己的 POD 类型(例如 struct Point {int x, y;} )?
  4. 如果他们不这样做,是否使用我自己的包装器围绕 new / delete / 使用 memcpy 的指针来处理整数/字符/我自己的结构数组之类的东西会更快?

【问题讨论】:

  • std::copy 参数可能有别名,所以一般memcpy 是不安全的。通常使用memmove 代替。
  • 我认为假设 memcpy 自动更快是错误的。您最终只是在复制字节,速度主要取决于您复制的数量(加上循环开销)。在某些情况下,memcpy 实际上可能会更慢,因为由于填充,它可能会复制比实际赋值运算符更多的数据。

标签: c++ visual-c++ gcc stl


【解决方案1】:

首先,std::copy 不会复制构造任何东西。 (这将是算法std::uninitialized_copy 的工作。)相反,它为旧范围的每个元素分配相应的新值。

其次,是的,编译器可以将赋值优化为内存副本,只要结果“好像”它执行了元素赋值一样。例如,GCC 通过让编译器支持识别这种可简单复制的类型来做到这一点,而 C++11 实际上添加了一个名为 std::is_trivially_copyable 的新类型特征,这对于 可以 被内存复制的类型完全正确。

【讨论】:

  • 这个答案涵盖了基础类型分配,但问题是关于容器的类型。
猜你喜欢
  • 1970-01-01
  • 2011-02-27
  • 2011-08-07
  • 2012-05-10
  • 2021-11-07
  • 1970-01-01
  • 2017-04-21
  • 2012-12-24
  • 1970-01-01
相关资源
最近更新 更多