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

什么是更好的:返回std::字符串的值或常量引用?[重复]

朱炳
2023-03-14

下面是一个包含两个返回类型不同的getter的类:

class A {
    std::string m_test { "test" };

public:
    std::string test_by_value { return m_test; }
    const std::string& test_by_const_ref() { return m_test; }
};

// ...

哪个更好?它是关于std::string的,而不是内置类型。S.T.L.说的是什么https://channel9.msdn.com/Events/GoingNative/2013/Don-t-Help-the-Compiler最好按值返回,因为将优化多个副本?还是我误解了他?

共有3个答案

包永新
2023-03-14

按值返回,因为编译器将优化返回值。

裴永年
2023-03-14

链接正确,按值返回string对象。NRVO将负责在后台返回引用,因此您的代码将具有完美的语义和干净性。

羊舌兴文
2023-03-14

按价值计算。

我在野外遇到了类似的代码:

A foo();

std::string const& x = foo().test_by_const_ref();

嘣,x是一个悬空的引用。

按值返回时不会发生这种情况。

 类似资料:
  • 可能重复: 是传递const std::string的天数 如果支持移动语义学,我应该通过值传递d::字符串吗?那么使用小字符串优化(SSO)的实现呢?

  • 问题内容: 我感兴趣的部分是: 谢谢你的帮助! 问题答案: 这意味着结果值将被强制转换为 和 (即可序列化的比较器) 请注意,在进行此类转换时,您 只能 指定一个类(和无限数量的接口),因为一个类不可能从一个以上的超类继承。

  • 本文向大家介绍Java中的字符串常量池是什么?,包括了Java中的字符串常量池是什么?的使用技巧和注意事项,需要的朋友参考一下 当您将字符串存储为 JVM会直接在一个单独的内存块(称为String常量池)中创建具有给定值的String对象。 每当我们尝试创建另一个String作为 JVM会验证String常量池中是否存在具有相同值的String对象,如果不是,JVM会创建新对象而不是创建新对象,而

  • 我读到字符串常量池也是自引用的,在这个链接中,它被写为字符串文本的创建: 将在堆中创建一个新字符串“new”(如果没有)。那么,这是否意味着不管对象是文本对象还是使用new关键字的新对象,都会在堆中创建对象? 我对intern的理解是-它检查堆中是否有同名的对象,然后引用它,否则在堆中创建新对象。如果我错了,请纠正。 我还有一个疑问——常量池是包含对象,还是只包含对堆中对象的引用。

  • 这可能是最简单的事情之一,但我没有看到我做错了什么。 我的输入包括第一行带有数字(要读取的行数),一堆带有数据的行和最后一行只带有\n。我应该处理这个输入,在最后一行之后,做一些工作。 我有这样的意见: 为了读取输入,我有以下代码。 我的问题是为什么我不打印任何东西?程序读取第一行,然后什么也不做。

  • 问题内容: 这是有效的,并返回JavaScript中的字符串 为什么?这是怎么回事 问题答案: 如果我们将其拆分,则混乱等于: 在JavaScript中,确实是这样。将某物转换为数字,在这种情况下,它将降为或(请参见下面的规范详细信息)。 因此,我们可以简化它(优先于): 因为意思是:从中获取第一个元素,所以确实: 返回内部数组()。由于引用,说错了,但是让我们调用内部数组以避免错误的表示法。 在