代码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
类型(和其他非基本类型)引用来被视为一种好的做法吗?
答案 0 :(得分:3)
是的,对于任何复制昂贵的对象,通常最好使用const引用。但是你必须注意,当你不期望它时,原始物体不会发生变化;特别是你需要确保原始对象不被破坏,因为这会导致未定义的行为。这不是你的玩具示例中的一个问题,但在现实世界中,这是一个很大的问题。
使用const引用的最佳位置是函数参数。您知道传递给函数的对象在仍然在函数内部时无法更改或被销毁。
答案 1 :(得分:2)
有几件事需要考虑。
如果您只想观察对象 :
如果对象的类型在副本上分配动态内存,则总是通过const引用传递
否则,如果类型的sizeof
大于sizeof(void*)
,则通过const引用。
否则按值传递。
如果您希望复制对象 ,则只需按值传递。
当然,在一个奇怪的用例中,您可能会做其他事情,但这是我看到的一般指导原则。
还要考虑移动语义,但这是一个不同的问题。