[英]Binding rvalue ref to string literal in constructor vs construct in-place
关于字符串文字和移动语义,我对 C++ 临时对象有点困惑。
就性能和可读性而言,以下哪一项更好。
用法: Constructor("string_literal")
选项 1: s
从字符串文字创建,然后将其移动到成员变量中。
Constructor(
string s
) : s_(std::move(s)) {}
选项 2:字符串文字被创建为临时的,然后绑定到s
,然后移动到成员s_
中。
Constructor(
string&& s
) : s_(std::move(s)) {}
选项 3:将左值 ref 传递给临时,然后复制构造s_
Constructor(
const string& s
) : s_(s)
在调用者将字符串文字传递给构造函数的情况下,选项 1 似乎更有效,因为我们分别跳过了右值引用绑定和左值引用绑定。
如果调用者将字符串传递给构造函数,则选项 1 将执行复制和移动,但选项 2 强制用户创建一个副本,然后移动该副本。 性能相同,但用户对 2 的 API 不太友好。
哪个是最好的选择? 谢谢。
当您有一个可移动的字符串并从文字构造和移动时,选项 1 将复制。
选项 2 将在您有可移动字符串时移动,并在您有文字时构造和移动。
选项 3 是最糟糕的,因为它总是会复制。
如您所见,选项 2 <= 1 <= 3。
还要考虑
Constructor("string_literal"s)
这是一个std::string
文字。 所以选项 2 只会将其移入。
注意:在许多情况下,编译器也可以优化副本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.