c++ - 向量如何将数据复制到另一个向量?
问题描述
假设我有这个:
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++ 数组标准做同样的事情?
解决方案
这很难绝对肯定地回答,因为它取决于您的工具链和优化级别以及(在某种程度上)命运。
我可能期望一个强大的编译器将您的循环优化为memcpy
不需要计数器和单个值副本的循环。或者也许不是。当然,您的似乎没有这样做。
我绝对希望矢量副本能够做到这一点(因为编写vector
实现的人很聪明,并且会发现这个机会)。
最终,您必须阅读实现的源代码才能确定。
如果您想尽快复制您的double[]
内容,请使用std::copy
.
这应该执行该优化。当然它不会比你的循环慢,并且可能更快。如果由于某种原因不是,您也可以尝试直接memcpy
(尽管这消除了类型安全)。
为什么memcpy
更快?
只要计算机预先知道这是您想要做的,计算机就可以快速地一次性删除字节块。
事实上,这是编写“说出你的意思”并让计算机决定如何执行的代码的一个很好的教训,而不是拼写出你认为任务需要的各个步骤,从而使计算机更难以最好的方式做你真正想要的。
在这种情况下,“计算机”是标准库实现、编译器和 CPU 的无定形伙伴关系。
推荐阅读
- pandas - 如何在 Spark 结构化流中使用 UDF(用户定义函数)?
- json - 如何使用 Json.Net 反序列化嵌套的 JSON 数组?
- android - 为什么我的颤振应用程序中有 exoplayer 2 错误?
- php - 为 PHP 的 DOMDocument 指定 UTF-8 编码,不带元标记
- sql - 尝试使用 pyspark SQL 上下文连接两个文件时出现 RuntimeException
- java - 部署在 weblogic 服务器上的 JAVA spring boot 中的 HTML 字符转义问题。它适用于 TEST 环境,但不适用于 PRODUCTION
- python - ModuleNotFoundError:即使安装后也没有名为“加密”的模块
- c# - 将发布者添加到 EXE 视觉工作室
- java - 添加 Maven 依赖项 (Scala) 后在 Intellij 中加载包时出错
- c++ - 解决分段错误(核心转储)错误