gpt4 book ai didi

c++ - C++11 是否使用移动语义来进行复制到分配优化?

转载 作者:行者123 更新时间:2023-11-30 01:16:06 25 4
gpt4 key购买 nike

假设我有一个名为 Foo 的类,它定义了合适的移动构造函数/赋值运算符。给定以下伪代码:

Foo some_func(Foo var) { 
<update var>
return var;
}

int main() {
Foo var;
var = some_func(var);
}

当将 var 传递给 some_func 时,C++11 是否会自动使用移动语义,并再次重新分配给 var,因为 var 的原始值无论如何都会被破坏?我认为这将是一个安全的优化,它可以让您编写与传递引用/指针一样快的纯函数。如果做不到,为什么不呢?我知道它可以通过 std::move 强制执行,但如果它是自动的,那就太棒了。

最佳答案

Will C++11 automatically use move semantics when passing var to some_func,

不,那是复制构造,因为 var 是左值。

该语言不允许编译器做任何其他事情。唯一一次左值被隐式移动而不是复制是在从函数返回它时,例如some_func 中的这一行将使用移动构造函数:

return var;

and again to re-assign to var, since the original value of var would be destroyed anyways?

这将使用 Foo 的移动赋值运算符,因为它将右值赋给 var

如果您使用 some_func(std::move(var)) 或者您这样写,您将避免任何复制:

Foo var = some_func({});

这创建了一个初始化函数参数的临时变量,然后返回函数参数,它将使用一个移动,然后 var 将被移动构造,但移动可以被省略。因此,编译器只允许对函数参数执行默认构造和对 var 执行移动构造。

关于c++ - C++11 是否使用移动语义来进行复制到分配优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27256152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com