std::copy 和容器的复制构造函数之间是否存在任何性能差异?
Are there any performance differences between std::copy and the container's copy constructor?
std::copy
是一种更通用的方法,因为它可以处理具有不同值类型的容器(例如,从std::vector<float>
复制到std::vector::<double>
)。但是,当两个容器的值类型相同时,我是否使用复制构造函数而不是std::copy
有关系吗?
不要担心性能,它们应该都非常接近。相反:
- 如果您正在创建一个新的副本容器,请使用副本构造函数或两个迭代器构造函数(如果元素类型不同)
- 如果要替换(分配)现有容器,请使用适当的分配运算符或
assign
成员 - 如果要替换元素的子集,请使用
std::copy
通过准确地表示您要做的事情,您可以为编译器提供最可能的信息来优化其代码(例如,直接从现有容器构建,它可以准确地预分配正确的内存)。
一个潜在的重要区别是,当您能够调用移动构造函数而不是复制构造函数时(例如,当您从中复制构建的对象是右值,例如函数的返回值)。如果你有这样的情况,你肯定想确保你通过移动构造或移动赋值来利用它,而不是使用std::copy。
基本上,这只是听从马克B建议的另一个原因。
相关文章:
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- 如何检查特定文件夹中是否存在任何文件?
- 除了字符串或宏调用之外,是否存在任何情况,其中"(<"是有效的字符流?
- std :: vector用作堆栈和std :: stack之间是否存在任何复杂性差异
- 是否存在与将数据流式传输到 c++ 异常类相关的任何危险
- P0960,是否有任何机制可以检测 c++20 中带有 ()s 的新聚合初始化中是否存在缩小?
- 在使用__file__,__line__时,是否存在任何兼容性问题
- 如果存在任何循环关系,我应该假设弱指针使用吗?
- 用“ strcpy”在2D数组中删除(字符)的一行(字符)时是否存在任何错误
- 结构数据D = {0}和结构数据D = {}之间是否存在任何区别
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- OpenCV和Tesseract之间是否存在任何冲突
- 使用成员对成员的引用是否存在任何陷阱
- 是否有任何理由在C 中使用布尔值的枚举,而不是已经存在的布尔
- 当使用不相等vs均等时,是否存在任何性能差异
- 如果在另一个库和链接到此库的应用程序中都使用了仅标头的库,是否存在任何问题
- 如何在不存在任何数据损坏风险的情况下序列化对象
- 对于每个标量“T”,是否有任何保证存在相同大小的整数
- 如何检查字符串中是否存在除"-","_","."'@' C++之外的任何符号?
- 两个线程之间是否存在任何内存泄漏(缓冲、清空)