c++ 中 rng 的实际成本与 ref 的比较
Real cost of rng in c++ compare with ref
在这个例子中:
#include <iostream>
#include <vector>
#include <string>
typedef std::vector<std::string> vs;
vs test1()
{
vs strings;
strings.push_back("a");
strings.push_back("b");
strings.push_back("c");
return strings;
}
void test2(vs& strings)
{
strings.push_back("a");
strings.push_back("b");
strings.push_back("c");
}
int main()
{
vs data = test1();
test2(data);
return 0;
}
我测试了两种填充字符串向量的方法。我认为在第一种情况下我们复制向量,在第二种情况下,它可能更好,因为我们只是给出向量的引用。那么有什么好方法,复制对计算机来说是一个非常大的成本吗?
谢谢你的回答!
为了清楚起见,我建议使用第一个。NRVO 应该不会对性能产生影响。
如果目的是创建一个新对象并返回它,则第一个。如果要修改现有方法,请使用第二个。
它们并不完全做同样的事情:
int main()
{
vs data{"test"};
data = test1();
//data is {a, b, c}
vs data2{"test"};
test2(data2);
//data is {test, a, b, c}
return 0;
}
第一个创建一个新向量,只有这三个字符串。第二个,在现有向量的末尾添加这三个字符串。因此,功能略有不同。
在性能方面,由于有(N)RVO和移动语义,您可以使用第一个更清晰的语义。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 对RValue对象调用的LValue ref限定成员函数
- 为什么比较运算符如此快速
- 将Ref对象作为类成员
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 比较字符数组
- 将模板化的类型与C++中的某些类/类型进行比较
- C++自定义比较函数
- 如何比较自定义类的std::变体
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- std::设置自定义比较器
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- C++将目录中的所有文件与::filesystem进行比较
- shell排序中的交换和比较
- 如何在C++中比较两个char数组
- catch框架有没有办法比较流或文件
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- c++ 中 rng 的实际成本与 ref 的比较
- 比较int和unsigned引用时警告,但比较g++/msvc的const(无ref)时没有警告