高效的字符串构造函数

时间:2013-07-30 00:42:06

标签: c++ string

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

 construct( const std::string& s );
 construct( const char* s );

拥有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;

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

补充问题 - C ++ 11是否会在此处改变构造?

2 个答案:

答案 0 :(得分:8)

在C ++ 03或C ++ 11中,如果没有指定移动语义,const char *std::string隐式转换会创建一个临时字符串,然后将其复制到成员中。这实现了额外的副本。

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

construct( std::string s ) : member( std::move( s ) ) {}

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

struct String {
    operator char const * () const;
};

由于只能隐式应用一个用户定义的转化,std::string函数不会通过String转换获得char const *参数。但请注意,如果使用std::string和两个构造函数的附加转换函数,结果将是过载模糊。

答案 1 :(得分:5)

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

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

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

 construct(std::string s ) : m_string( std::move(s) ) {}

在这种情况下,如果您只有char*数据可能会被复制到字符串ctor中,但字符串将是临时的,因此它将被移动到construct ctor

This code打印“创建,复制”
This code打印“创建,移动”