mar*_*zzz 3 c++ optimization stl
我想说:
const int MAX_BUFFER = 1024;
std::vector<double> AV(MAX_BUFFER);
std::vector<double> CV{ AV };
Run Code Online (Sandbox Code Playgroud)
怎么AV
复制成CV
?
如果我使用double
s 数组(即double[]
),它需要更多(在MSVC上尝试使用分析器/Oi
):
for (int sampleIndex = 0; sampleIndex < MAX_BUFFER; sampleIndex++) {
C[sampleIndex] = A[sampleIndex];
}
Run Code Online (Sandbox Code Playgroud)
它如何更快地复制?我怎么能用C++数组标准做同样的事情?
这绝对肯定很难回答,因为它取决于你的工具链和你的优化水平以及(在某种程度上)命运.
我希望强大的编译器可以将您的循环优化为memcpy
不需要计数器和单个值副本的循环.或许不是.当然看起来你的不这样做.
我肯定希望矢量副本能够做到这一点(因为无论谁编写vector
实现都是聪明的,并且会发现这个机会).
最终你必须阅读实现的源代码才能确定.
如果要尽快复制double[]
内容,请使用std::copy
.
这应该执行该优化.当然它不会比你的循环慢,而且可能更快.如果由于某种原因它不是,你也可以尝试直接memcpy
(虽然这消除了类型安全).
memcpy
更快?只要他们事先知道这就是你想要做的事情,计算机就可以一步到位地捣毁字节块.
事实上,这是编写"说出你的意思"的代码的一个很好的教训,让计算机决定如何去做,而不是拼出你认为任务需要的各个步骤,从而使计算机更难尽可能以最好的方式做你真正的意思.
在这种情况下,"计算机"是标准库实现,编译器和CPU的无定形伙伴关系.