从类返回 std::string 是否分配内存?

问题描述

从类中返回 std::string(就此而言,std::vector)是否会分配内存?

如果我有这门课:

class Bla
{
    public:
        Bla();
       
        const std::string& Getstr() const
        {
            return m_Str;
        }  

    private:
        std::string m_Str;
};

我有一些这样的代码

std::string currentString = Bla.Getstr();
if (Bla.Getstr() == "abc"){}

这两个都分配了一个全新的字符串吗?

解决方法

对于std::string

#include <string>
class Bla
{
public:
    Bla() {}

    const std::string& GetStr() const
    {
        return m_Str;
    }

private:
    std::string m_Str = "Hi";
};

int main() {
    Bla bla;
    std::string currentString = bla.GetStr(); //1. will allocate new string
    const std::string& secondString = bla.GetStr(); //2. will be a const reference to m_Str
    if (bla.GetStr() == "abc") {} //3. will be  a const reference to m_str,and therefore not another allocated string
}

如果将 GetStr() 的结果(常量引用)分配给普通的 std::string,例如 1.,将分配字符串。

如果您将 GetStr() 的结果(它是一个常量引用)分配给另一个常量引用(如 2.),它们将引用同一个对象,即 m_Str

如果将作为常量引用的 GetStr() 的结果与另一个字符串或字符串文字(如 3.)进行比较,则不会分配字符串,并且会进行比较与引用的对象,在本例中为 m_Str 与另一个字符串,在本例中为 const char[] (又名字符串文字)。 (与这里比较的是“abc”)。

但是,

m_Str 将被分配。

对于std::vector

如果返回 std::vector& 的函数的结果被分配给普通的 std::vector(不是引用),则它被分配。

如果返回 std::vector& 的函数的结果被分配给另一个对向量的引用,那么它不会被分配。

如果使用比较运算符将返回 std::vector& 的函数的结果与另一个 std::vectorstd::vector& 进行比较,则不会分配。

编辑:正如 Evg 所指出的,运算符 == 有一个重载,它接受一个 std::string 和一个 const char*。如果它不存在,bla.GetStr() == "abc" 将不得不从 "abc" 构造和分配一个新字符串才能比较两者。

,

从函数返回 std::string 后,它会被调用到移动构造函数,以确保将字符串的内存转移到外部作用域