首页 > 解决方案 > 向量如何将数据复制到另一个向量?

问题描述

假设我有这个:

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

是怎么AV复制进去的CV

如果我使用 s 数组double(即double[])具有相同的功能,则需要更多(尝试使用 MSVC 上的探查器和/Oi):

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

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

标签: c++optimizationstl

解决方案


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

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

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

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

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

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


为什么memcpy更快?

只要计算机预先知道这是您想要做的,计算机就可以快速地一次性删除字节块。

事实上,这是编写“说出你的意思”并让计算机决定如何执行的代码的一个很好的教训,而不是拼写出你认为任务需要的各个步骤,从而使计算机更难以最好的方式做你真正想要的。

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


推荐阅读