让我说:
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 ++数组标准做同样的事情?
答案 0 :(得分:7)
很难绝对确定地回答这个问题,因为它取决于您的工具链和优化级别,并且(在某种程度上)取决于命运。
我可能希望强大的编译器将您的循环优化为一个memcpy
,该循环不需要计数器和单个值副本。也许不是。当然,看来您没有这样做。
我绝对希望向量副本能够做到这一点(因为编写vector
实现的人很聪明,并且会发现这个机会)。
最终,您必须阅读实现的源代码才能确定。
如果要尽快复制double[]
内容,请使用std::copy
。
此应该进行优化。当然,它不会比您的循环慢,并且可能会更快。如果不是因为某种原因,您也可以尝试直接使用memcpy
(尽管这样可以消除类型安全性)。
memcpy
更快?只要预先知道这是您要执行的操作,计算机就可以快速地一次写入字节块。
实际上,这是编写“说出你的意思”并让计算机决定如何执行代码的代码的一个很好的教训,而不是拼写出您认为任务需要的单个步骤,从而使任务变得更难让计算机以最好的方式完成您真正的意图。
在这种情况下,“计算机”是标准库实现,编译器和CPU的不固定伙伴关系。
答案 1 :(得分:4)
使用标准算法,您可以使用数组实现类似的简洁性和可读性:
std::copy(A, A + MAX_BUFFER, B);
就速度而言,这取决于标准库的实现方式以及编译器如何优化循环。