cstring - > c ++字符串转换

时间:2012-05-14 16:49:00

标签: c++ string performance

如果我有一个功能

void x(std::string const& s)
{
   ...
}

我称之为x(“abc”),字符串构造函数会在其中分配内存并复制数据吗?

4 个答案:

答案 0 :(得分:4)

将使用const char*参数

调用std :: string构造函数

无法确定是否会(动态)分配内存,但是标准库实现可能存在SSO,这意味着它可以存储没有动态分配的小字符串。

SSO:Meaning of acronym SSO in the context of std::string

答案 1 :(得分:1)

是的,编译器将生成必要的代码来创建std::string并将其作为参数传递给x函数。

答案 2 :(得分:1)

这个问题标有“表现”,所以这实际上是一个很好的问题IMO。

我知道的所有编译器在堆上分配字符串的副本。但是,当从字符串文字构造r值std::string时,某些实现可以使std::string类型固有到编译器中并优化堆分配。

,例如,这不是这种情况,但MSVC能够在静态对象作为静态动态初始化的一部分完成时替换堆分配,至少在某些情况下是这样。

答案 3 :(得分:0)

除非使用explicit关键字标记,否则采用单个参数的构造函数将用于从参数类型隐式转换为对象的实例。

在此示例中,std::string有一个带有const char*参数的构造函数,因此编译器使用它来隐式地将字符串文字转换为std::string对象。然后将新创建的对象的const引用传递给您的函数。

以下是更多信息:What does the explicit keyword mean in C++?