【发布时间】:2017-08-09 06:38:50
【问题描述】:
代码 A:
string a = "Hello World";
for (int i=0; i<1000000; ++i)
const string b = a;
代码 B:
string a = "Hello World";
for (int i=0; i<1000000; ++i)
const string &b = a;
如果我分别运行 2 个代码并测量 CPU 时间,代码 B 比代码 A 快大约 2.5 倍。
除了char、int、float 等基本类型之外...我了解到获取原始引用比复制它更快。
尽管在大多数情况下差异几乎可以忽略不计,但是否可以将始终引用 const string 类型(和其他非原始类型)视为一种好习惯?
【问题讨论】:
-
通常的指导方针如下。如果一个类型的
sizeof大于sizeof(void*),则始终通过 const 引用传递,否则通过复制传递。如果要更改对象,请传递非常量引用,而不管大小。 -
也有例外——例如,如果你想在函数中制作参数的副本,然后按值传递——它会隐式地制作你想要的副本,并且可以利用诸如移动操作以有效地做到这一点。
-
类可能会定义自定义的复制或赋值运算符(就像字符串一样),所以
sizeof并不总是一个很好的复制时间指标。 -
不是“每个”,你需要确保你使用包含在被引用对象的生命周期内的引用(
b)(a) -
你的编译器很烂。 :) 两个代码都没有任何效果;它应该减少到
ret指令或其他任何东西。
标签: c++ string optimization types reference