向量如何将数据复制到另一个向量?

时间:2018-10-26 10:28:49

标签: c++ optimization stl

让我说:

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

如何将AV复制到CV中?

如果我使用double数组(即double[])得到相同的内容,则需要更多的时间(在MSVC和/Oi上使用探查器进行了尝试):

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

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

2 个答案:

答案 0 :(得分:7)

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

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

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

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

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

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


为什么memcpy更快?

只要预先知道这是您要执行的操作,计算机就可以快速地一次写入字节块。

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

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

答案 1 :(得分:4)

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

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

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