繁体   English   中英

在构造函数中将右值引用绑定到字符串文字与就地构造

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM