STL复制效率

Bar*_*uch 2 c++ gcc stl visual-c++

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

那么,STL是否需要/允许专门化,例如,vector<int>复制只会做一个memcpy
以下问题我将非常感谢GCC/MSVC,因为那些是我使用的编译器.

  1. 如果允许但不是必需的话,上面的编译器是否真的这样做了?
  2. 如果他们这样做,这将触发哪些容器?显然它没有任何意义list,但是string或者是deque什么?
  3. 再次,如果他们这样做,哪些包含类型会触发这个?只有内置类型,或者我自己的POD类型(例如struct Point {int x, y;})?
  4. 如果他们不这样做,那么使用我自己的包装器new/ delete/指针来使用memcpy像integer/char /我自己的struct数组这样的东西会更快吗?

Ker*_* SB 7

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

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