我在生命周期即将结束时将一些对象传递给构造函数。

int main(){

    //I wanted to avoid short string optimization in this example.
    const std::string a(25,"a");
    const std::string b(25,"b");
    const std::string c(25,"c");

    Foo f{a,b,c};
}

我为Foo的构造函数考虑了两个选项。
const&(调用字符串的副本构造函数):
Foo(const std::string & a,
    const std::string & b,
    const std::string & c)
:a(a)
,b(b)
,c(c)
{}
std::move(调用字符串的move构造函数):
Foo(std::string a,
    std::string b,
    std::string c)
:a(std::move(a))
,b(std::move(b))
,c(std::move(c))
{}

使用-01上的gcc 7,我得到以下结果:
+-------------+-----------------------+
| constructor | assembly instructions |
+-------------+-----------------------+
| const&      |                   192 |
| move        |                   264 |
+-------------+-----------------------+

为什么const&少了指令?
我认为此举比通过复制构造函数创建新字符串要便宜。

将变量作为构造函数参数传递的经验法则是什么
这些争论的寿命何时结束?

最佳答案

您没有在调用move构造函数。您的参数字符串是const。因此,当您在它们上使用std::move时,结果为const std::string&&。这不会调用move构造函数,后者的签名采用std::string&&

关于c++ - 为什么 move 比通过const&更昂贵?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39864497/

10-11 22:53
查看更多