将每个const字符串引用是一种好习惯吗?

时间:2017-03-17 15:57:14

标签: c++ string optimization types reference

代码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倍。

charintfloat之类的原始类型外...我了解到获取对原始内容的引用要快于复制它。

虽然在大多数情况下差异几乎可以忽略,但是总是可以将const string类型(和其他非基本类型)引用来被视为一种好的做法吗?

2 个答案:

答案 0 :(得分:3)

是的,对于任何复制昂贵的对象,通常最好使用const引用。但是你必须注意,当你不期望它时,原始物体不会发生变化;特别是你需要确保原始对象不被破坏,因为这会导致未定义的行为。这不是你的玩具示例中的一个问题,但在现实世界中,这是一个很大的问题。

使用const引用的最佳位置是函数参数。您知道传递给函数的对象在仍然在函数内部时无法更改或被销毁。

答案 1 :(得分:2)

有几件事需要考虑。

  1. 您的用例。你想复制还是想观察?
  2. 类型是否执行深层复制语义(例如,在复制时分配动态内存)?
  3. 如果您只想观察对象
    如果对象的类型在副本上分配动态内存,则总是通过const引用传递 否则,如果类型的sizeof大于sizeof(void*),则通过const引用。
    否则按值传递。

    如果您希望复制对象 ,则只需按值传递。

    当然,在一个奇怪的用例中,您可能会做其他事情,但这是我看到的一般指导原则。

    还要考虑移动语义,但这是一个不同的问题。