【问题标题】:How vector copy data to another vector?向量如何将数据复制到另一个向量?
【发布时间】:2018-10-27 07:05:09
【问题描述】:

假设我有这个:

const int MAX_BUFFER = 1024;
std::vector<double> AV(MAX_BUFFER);
std::vector<double> CV{ AV };

AV如何复制到CV

如果我使用doubles 的数组(即double[])也有相同的情况,则需要更多(在MSVC 和/Oi 上使用分析器尝试):

for (int sampleIndex = 0; sampleIndex < MAX_BUFFER; sampleIndex++) {
    C[sampleIndex] = A[sampleIndex];
}

它如何更快地复制?如何使用 C++ 数组标准做同样的事情?

【问题讨论】:

  • 你的意思是什么?这取决于优化级别,可能会在 /O3 中使用 memcpy。
  • 使用std::memcpy
  • 请注意,优化取决于向量的value_type。对于 POD(普通、旧数据)类型,例如 doubleint,可能会使用 std::memcpy 来实现最佳性能。对于非POD类型(如std::string),不能使用std::memcpy
  • 你知道std::copy吗?它应该选择最快的方法。但我会对您测试的代码感兴趣。
  • std::vector 构造函数以及 std::copy() 通常对在内部使用 memcpy() 的 POD 类型进行专门化。

标签: c++ optimization stl


【解决方案1】:

这很难绝对肯定地回答,因为它取决于您的工具链和优化级别以及(在某种程度上)命运。

我可能期望一个强大的编译器将您的循环优化为不需要计数器和单个值副本的memcpy。或者也许不是。当然,您的似乎没有这样做。

我绝对希望矢量副本能够做到这一点(因为编写 vector 实现的人很聪明,并且会发现这个机会)。

最终你必须阅读实现的源代码才能确定。

如果您想尽快复制double[] 的内容,请使用std::copy

应该执行该优化。当然它不会比你的循环慢,并且可能更快。如果由于某种原因不是,您也可以直接尝试memcpy(尽管这会消除类型安全性?)。


为什么memcpy 更快?

只要计算机预先知道这是您想要执行的操作,它们就可以快速地一次性清除字节块。

事实上,这是编写“说出你的意思”并让计算机决定如何执行的代码的一个很好的课程,而不是拼写出你认为任务需要的各个步骤,从而使其变得更难让计算机以尽可能好的方式执行您真正的意思。

在这种情况下,“计算机”是标准库实现、编译器和 CPU 的无定形伙伴关系。

【讨论】:

  • 当我创建了一个向量而不是初始化后,CV{ AV }; 的等价物是什么?比如写std::vector&lt;double&gt; CV和后面几行代码一样“块复制”吗?简历 = AV?相同的“速度”?
  • @markzzz 是的,等效操作。如果您不需要调整现有缓冲区(如果有)的大小,则速度会稍快一些。因为不要忘记第一个向量构造也需要分配内存。
【解决方案2】:

您可以通过使用标准算法的数组实现类似的简洁性和可读性:

std::copy(A, A + MAX_BUFFER, B);

就速度而言,它取决于标准库是如何实现的,以及编译器如何优化你的循环。

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多