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

which is the Memory efficient way to pass the string as argument to a function.?

本文关键字:函数 内存 有效 方式 参数传递 字符串      更新时间:2023-10-16

谁能告诉我,传递string作为func(string&)有什么好处吗?而不是func(string).

按引用传递对象意味着,你是按值传递引用,而不是按值传递对象,这意味着你必须在函数调用时复制一个。

然而,引用传递引入了一组你必须注意的新问题:

  1. 函数是否修改传递的对象?如果没有,应该输入const修饰符
  2. 函数是否需要修改对象,但不暴露函数边界之外的修改?在这种情况下,你真正需要的是一个副本。
  3. 函数是否在某处/以某种方式存储传递对象的引用?在这种情况下,您必须了解对象所有权是如何传递的,以及何时删除它是安全的。您可能需要使用智能指针来处理这些问题

关键是:仅仅因为按引用传递使函数调用更便宜并不意味着在任何情况下都必须使用它。

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

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

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

如果您的函数无论如何都需要获取参数的副本,则优选按值传递。

传递引用通常对复杂类型更有效,但它应该是对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

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

当您将其作为string传递时,字符串首先被复制并将副本发送给函数。传递昂贵的对象(如字符串),如果你不想让函数修改它们,最好的方法是通过const string&

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

就性能而言,按引用传递通常比按值传递更好(不包括内置数据类型)。所以是的,func(string&)func(string)好。前提是在函数结束时可以修改传递的string。如果您不打算更改string,则使用func(const string&)

另一方面,我记得在STL的某个地方读到,string s是优化的。意味着如果你按值传递string,它不一定会在堆上创建一个新的字符串。因此,按值传递可能没有您期望的那么昂贵。例如

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

是。传递引用总是有效的。
字符串可以按值存储,复制可能需要长达O(n)的时间(即,复制所需的时间与字符串的长度成正比)。它还会导致分配堆内存,这通常比复制要昂贵得多。
你也可以考虑通过引用来传递const,即func(const string &),以避免任何非国际更改。

您也可以尝试使用move语义来使用右值引用优化。

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