2

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

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

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

1 回答 1

7

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

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

于 2012-05-20T12:51:44.817 回答