高效的字符串构造函数

Kor*_*icz 7 c++ string

我遇到的一些类有一个双字符串构造函数:

 construct( const std::string& s );
 construct( const char* s );
Run Code Online (Sandbox Code Playgroud)

拥有一个std::string构造函数具有能够传递一个std::string没有的明显好处c_str().但是,如果参数存储在std :: string中,那么const char*构造函数是否有任何好处?

特别是:

 construct( const std::string& s ) : m_string( s ) {}
 construct( const char* s ) : m_string( s ) {}
 std::string m_string;
Run Code Online (Sandbox Code Playgroud)

对于字符串文字和char*变量,第二个构造函数会更快,还是会被优化掉?

附加问题 - C++ 11移动构造在这里改变了什么吗?

Pot*_*ter 8

在C++ 03,或在C++ 11没有指定移动语义中,const char *std::string隐式转换创建一个临时串,然后把它复制到构件.这实现了额外的副本.

在C++ 11中,您可以在传递值后转移临时值:

construct( std::string s ) : member( std::move( s ) ) {}
Run Code Online (Sandbox Code Playgroud)

我唯一能想到的是与提供转换运算符的其他类的兼容性.

struct String {
    operator char const * () const;
};
Run Code Online (Sandbox Code Playgroud)

由于只能隐式应用一个用户定义的转换,因此该std::string函数不会String通过转换接收参数char const *.但是请注意,std::string对于构造函数和两个构造函数都有额外的转换函数,结果将是过载模糊.


Ria*_*iaD 5

如果您char*只有第一个构造函数,则可以复制2次.in std::string(char*)并在construct(std::string)

而在第二个构造函数指针将被复制(它很快),然后复制字符串.

在C++ 11中,好主意是创建1个构造函数

 construct(std::string s ) : m_string( std::move(s) ) {}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果你只有char*数据可能被复制到字符串ctor,但字符串将是临时的,所以它将被移动到constructctor

此代码打印"创建,复制"
此代码打印"创建,移动"