STL复制效率

时间:2012-05-20 12:47:17

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

我的理解是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来处理整数/ char /我自己的struct数组这样的包装会更快吗? ?

1 个答案:

答案 0 :(得分:7)

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

其次,确实如此,编译器可以优化分配到memcopy中,只要结果与执行元素分配的结果相同。例如,GCC通过让编译器支持来识别这种易于复制的类型来实现这一点,而C ++ 11实际上添加了一个名为std::is_trivially_copyable的新类型特征,这对于可以的类型是正确的memcopied。