问题描述
从类中返回 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::vector
或 std::vector&
进行比较,则不会分配。
编辑:正如 Evg 所指出的,运算符 ==
有一个重载,它接受一个 std::string
和一个 const char*
。如果它不存在,bla.GetStr() == "abc"
将不得不从 "abc"
构造和分配一个新字符串才能比较两者。
从函数返回 std::string 后,它会被调用到移动构造函数,以确保将字符串的内存转移到外部作用域