当前位置: 首页 > 知识库问答 >
问题:

通过值或引用传递std::字符串[重复]

孔梓
2023-03-14

可能重复:
是传递const std::string的天数

如果支持移动语义学,我应该通过值传递d::字符串吗?那么使用小字符串优化(SSO)的实现呢?

共有3个答案

刘兴修
2023-03-14

我相信正常的答案是,如果您需要在函数中复制它,它应该按值传递。否则通过常量引用传递它。

下面是一个很好的讨论:http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

蔡弘扬
2023-03-14

检查C 11的答案。基本上,如果将左值传递给右值引用

从这篇文章中:

void f1(String s) {
    vector<String> v;
    v.push_back(std::move(s));
}
void f2(const String &s) {
    vector<String> v;
    v.push_back(s);
}

"对于左值参数,'f1'有一个额外的副本来传递参数,因为它是按值的,而'f2'有一个额外的副本来调用push_back。所以没有区别;对于右值参数,编译器必须创建一个临时的“字符串(L”)”,并无论如何将临时的传递给“f1”或“f2”。因为'f2'可以利用移动ctor当参数是一个临时(这是一个右值),传递参数的成本是相同的现在'f1'和'f2'。

继续:“这意味着在C 11中,在以下情况下,我们可以通过使用传递值方法获得更好的性能:

  1. 参数类型支持移动语义-所有标准库组件在C 11中都支持
  2. 移动构造函数的成本比复制构造函数便宜得多(时间和堆栈使用)
  3. 在函数内部,参数类型将传递给另一个支持复制和移动的函数或操作
  4. 传递一个临时变量作为参数是很常见的,您可以组织代码来做更多的工作

"

OTOH,对于C98来说,最好是通过引用来传递—无引用的数据会被复制。传递常量或非常量取决于是否需要更改参数。

樊宏义
2023-03-14

根据你对字符串的处理,有多个答案。

1) 将字符串用作id(不会修改)。通过常量引用传递它可能是这里最好的方法:(std::string const

2) 正在修改字符串,但不希望调用方看到该更改。最好按值传入:(std::string)

3)修改字符串,但希望调用方看到更改。最好通过引用传递它:(std::字符串

4) 将字符串发送到函数中,函数的调用方将不再使用该字符串。使用移动语义可能是一个选项(std::string

 类似资料:
  • 有一组好的规则来确定是按值传递还是常量引用 如果函数打算将参数更改为副作用,则通过non-const引用。 如果函数不修改它的参数,并且参数是基元类型,则按值取它。 否则通过const引用获取它,除非在以下情况下:如果函数需要复制const引用,则按值获取它。 对于以下构造函数,如何确定它?

  • 问题内容: 我习惯在中执行以下操作: 输出为: 但是,在Java中,这似乎不起作用。我认为是因为该对象是复制的,而不是通过referenced传递的。我以为字符串是对象,总是通过引用传递。 这里发生了什么? 问题答案: 你有三种选择: 使用StringBuilder: 创建一个容器类,并将容器的实例传递给你的方法: 创建一个数组: 从性能的角度来看,StringBuilder通常是最佳选择。

  • 问题内容: 通过此链接:如何通过引用传递变量?我们知道,Python在将字符串(作为不可变类型变量)作为参数传递给函数时会复制它,但是我认为如果字符串很大,它将浪费内存。在许多情况下,我们需要使用函数来包装一些字符串操作,所以我想知道如何使其更有效? 问题答案: Python不会复制传递给函数的对象(包括字符串): 如果您需要“修改”函数中的字符串,请返回新字符串并将其分配回原始名称: 不幸的是,

  • 本文向大家介绍JavaScript 通过引用或值传递参数,包括了JavaScript 通过引用或值传递参数的使用技巧和注意事项,需要的朋友参考一下 示例 在JavaScript中,所有参数均按值传递。当函数将新值分配给参数变量时,该更改将对调用者不可见: 但是,对此类参数的(嵌套)属性所做的更改对调用者将是可见的: 这可以看作是通过引用进行的调用:尽管函数无法通过为其分配新值来更改调用者的对象,但

  • 问题内容: 我正在使用SWIG从Java访问C ++代码。 公开非常量引用传递的std :: string参数的最简单方法是什么? 我有参考暴露为Java数组传递原语,感谢typemaps.i,和s ^暴露,感谢std_string.i。但是非const std :: string&被公开为不透明指针类型。 当前: 期望的: 更新 :我找到 了 解决方案,如下所述。但是,它花费了超过几秒钟的时间。

  • 问题内容: 该程序给出6作为输出,但是当我取消注释第9行时,输出为5。为什么?我认为ba不应更改,主要应保持5。 问题答案: 在Java中传递对象时,它们将作为in 方法中引用的参考含义对象和method 中的参数传递,它们都指向同一对象,因此,当您将值更改为6时,它将反映在方法中。 现在,当您尝试执行此操作时,您将指向另一个对象,但仍指向您在方法中创建的对象,因此更新的值6在main方法中不可见