如果我有一个功能
void x(std::string const& s)
{
...
}
我称之为x(“abc”),字符串构造函数会在其中分配内存并复制数据吗?
答案 0 :(得分:4)
将使用const char*
参数
无法确定是否会(动态)分配内存,但是标准库实现可能存在SSO,这意味着它可以存储没有动态分配的小字符串。
答案 1 :(得分:1)
是的,编译器将生成必要的代码来创建std::string
并将其作为参数传递给x
函数。
答案 2 :(得分:1)
这个问题标有“表现”,所以这实际上是一个很好的问题IMO。
我知道的所有编译器将在堆上分配字符串的副本。但是,当从字符串文字构造r值std::string
时,某些实现可以使std::string
类型固有到编译器中并优化堆分配。
,例如,这不是这种情况,但MSVC能够在静态对象作为静态动态初始化的一部分完成时替换堆分配,至少在某些情况下是这样。
答案 3 :(得分:0)
除非使用explicit
关键字标记,否则采用单个参数的构造函数将用于从参数类型隐式转换为对象的实例。
在此示例中,std::string
有一个带有const char*
参数的构造函数,因此编译器使用它来隐式地将字符串文字转换为std::string
对象。然后将新创建的对象的const引用传递给您的函数。