std::string const& 参数是否复制传递的 const char*?

时间:2021-05-11 05:07:11

标签: c++ string optimization c++17 implicit-conversion

对不起,如果这是一个非常菜鸟的问题。我需要知道 C++ 是否已经支持以下行为:

void sampleFunc(std::string const& p_sVal){
    
    Log("this is your string: " + p_sVal);

}

int main(){
    
    sampleFunc("my string");   //does the param allocates a copy of "my string"...?
    
}

参数 std::string const& p_sVal 是否分配了传递的 const char* 的副本,或者编译器足够聪明,知道传递的是 const char* 并且可以优化它不需要分配和复制?

如果没有,您能否建议实现此目的的示例代码? (注意:除了 string_view 解决方案。)

1 个答案:

答案 0 :(得分:2)

根据您传递给它的字符串文字构造临时 std::string,供 std::string const& 参数引用。

正如评论中所建议的,std::string 拥有它的存储空间(否则它将是 std::string_view,不是吗?)。在我看来,仅此观察并不能真正告诉您临时std::string不能从传递的参数中窃取资源。

资源仍然可以移动,因为您将右值传递给 sampleFun,对吗?不,错了,因为正如您所看到的 here,文字字符串,例如 "my string" 中的 main,是左值,而不是右值。

哦,即使字符串文字是右值,从 std::string's (well, std::basic_string's) constructor 上的文档中您会看到,除了“移动构造函数”(即移动版本)之外,没有其他构造函数采用 &&复制构造函数,即采用与其正在构造的相同类型的构造函数,即 std::string,而不是 const char*)。

请注意,由于您正在执行 "this is your string: " + p_sVal,您确实希望在某个时刻构造一个 std::string,因为您需要 std::operator+ 才能工作。您可以让 sampleFunc 接受 const char*,但是您必须将 p_sVal 或字符串文字包装在 std::string{…} 中才能使 + 工作。