这是将字符串作为参数传递给函数的内存有效方法。

时间:2011-10-19 11:07:09

标签: c++ string memory-management

任何人都可以告诉我。将字符串作为func(string&)而不是func(string)传递有任何好处。

8 个答案:

答案 0 :(得分:4)

func(string &)通过引用传递字符串。这意味着它不会被复制,并且该函数可以修改它。

func(string)按值传递字符串。这意味着将创建一个副本,并且该函数只能修改它自己的该字符串的本地副本。

要传递字符串而不复制,但要阻止它被修改使用func(const string&)

如果你的函数需要复制一个参数,最好按值传递。

答案 1 :(得分:4)

通过引用传递对象意味着您按值传递引用,而不是按值传递对象,这意味着您必须在函数调用中复制了一份。

但是,传递引用会引入一组您必须注意的新问题:

  1. 该函数是否修改了传递的对象?如果没有,您应该加入const修饰符
  2. 该函数是否需要修改对象,但不能将修改暴露在函数边界之外?在这种情况下,你真正想要的是一份副本。
  3. 该函数是否以某种方式存储传递对象的引用?在这种情况下,您必须了解如何传递对象所有权以及何时删除它是安全的。您可能希望使用smart pointers来处理这些问题
  4. 重点是:仅仅因为传递引用使函数调用更便宜并不意味着你必须在任何情况下都使用它。

答案 2 :(得分:2)

对于复杂类型,传递引用通常会更有效,但它应该是const的引用,除非您希望函数能够修改它:

void f(string);        // function gets its own copy - copying may be expensive
void f(string&);       // function can modify the caller's string
void f(string const&); // function can read the caller's string, but not modify it

答案 3 :(得分:1)

您还可以使用func(const string& )代替func(string& )来确保传递的参数参数不会在函数内被错误地更改。

答案 4 :(得分:1)

当您将其作为string传递时,首先复制字符串并将副本发送到该函数。如果您不希望函数修改它们,传递昂贵对象(如字符串)的最佳方法是const string&

const很重要。首先,它确保不会在函数内部修改字符串。此外,如果不使用它func("this is a litearal because it isn't inside a variable"),您将无法将文字传递给函数。

答案 5 :(得分:0)

就性能而言,通过引用传递通常比传递值更好(排除内置数据类型)。所以是func(string&)优于func(string)。只要在函数完成时可以修改传递的string。如果您不打算更改string,请使用func(const string&)

另一方面,我记得在某个地方读过STL,string被优化了。表示如果按值传递string,则可能不一定在堆上创建新字符串。因此,按价值传递可能并不像您期望的那么昂贵。 e.g。

string s1 = "hello";  // new buffer allocated on heap and copied "hello"
string s2 = s1;  // s2 and s1 both 'may' refer to same heap 
...
s1 += " world"; // s2 continue referring to old heap ...
                // new heap created to accomodate "hello world" referred by s1

答案 6 :(得分:0)

是。传递参考总是有效的 字符串可以按值存储,并且复制可以采用与O(n)一样长的时间(即,复制花费时间与字符串的长度成比例)。它还会导致分配堆内存,这通常比副本贵得多 你也可以考虑通过reference-to-const,即func(const string&)来传递,以避免任何意外的变化。

答案 7 :(得分:0)

您还可以尝试使用移动语义来使用rvalue引用优化。

void func(string &&s)
{
    myS = std::move(s);
}