任何人都可以告诉我。将字符串作为func(string&)而不是func(string)传递有任何好处。
答案 0 :(得分:4)
func(string &)
通过引用传递字符串。这意味着它不会被复制,并且该函数可以修改它。
func(string)
按值传递字符串。这意味着将创建一个副本,并且该函数只能修改它自己的该字符串的本地副本。
要传递字符串而不复制,但要阻止它被修改使用func(const string&)
。
如果你的函数需要复制一个参数,最好按值传递。
答案 1 :(得分:4)
通过引用传递对象意味着您按值传递引用,而不是按值传递对象,这意味着您必须在函数调用中复制了一份。
但是,传递引用会引入一组您必须注意的新问题:
const
修饰符重点是:仅仅因为传递引用使函数调用更便宜并不意味着你必须在任何情况下都使用它。
答案 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);
}