考虑以下代码:

void doSomethingWithString(string& mString)
{
     // mString gets modified in here
}

string getCopy1(const string& mString)
{
    string result{mString}; doSomethingWithString(result); return result;
}

string getCopy2(string mString)
{
    doSomethingWithString(mString); return mString;
}

getCopy1getCopy2之间,哪一个:
  • 清楚地表明传递的字符串不会得到修改
  • 清楚地表明用户将获得一个返回的新字符串
  • 更快/可以通过编译器更好地优化(启用C++ 11,请考虑移动语义)

  • 最佳答案

    两种版本都清楚地表明没有意图修改传入的值。

    在将右值作为参数传递的情况下,getCopy2效率更高。在这种情况下,无需复制,因为将移动参数而不是复制参数,并且您也没有内部复制。对于getCopy1,您始终会强制执行至少一个副本。如果将左值作为参数传递,则需要执行移动而不是创建引用。哪种效率更高取决于编译器和字符串实现的许多细节,但是移动的速度应与创建引用的速度相当。

    就返回值而言,我没有看到任何区别。

    08-06 01:10