gpt4 book ai didi

c++ - pass-by-value-and-then-move 结构是一个坏习惯吗?

转载 作者:IT老高 更新时间:2023-10-28 13:22:45 24 4
gpt4 key购买 nike

由于我们在 C++ 中有 move 语义,现在通常这样做

void set_a(A a) { _a = std::move(a); }

原因是,如果 a 是一个右值,则拷贝将被省略,并且只有一步。

但是如果 a 是左值会发生什么?似乎会有一个复制构造,然后是一个 move 赋值(假设 A 有一个正确的 move 赋值运算符)。如果对象具有太多成员变量,则 move 分配的成本可能会很高。

另一方面,如果我们这样做了

void set_a(const A& a) { _a = a; }

只有一份拷贝分配。如果我们要传递左值,我们可以说这种方式优于按值传递的习惯用法吗?

最佳答案

昂贵的 move 类型在现代 C++ 使用中很少见。如果您担心 move 的成本,请编写两个重载:

void set_a(const A& a) { _a = a; }
void set_a(A&& a) { _a = std::move(a); }

或完美转发二传手:

template <typename T>
void set_a(T&& a) { _a = std::forward<T>(a); }

将接受左值、右值和任何其他可隐式转换为 decltype(_a) 的内容,而无需额外的复制或 move 。

尽管在从左值设置时需要额外的 move ,但这种习惯用法并不是不好,因为 (a) 绝大多数类型都提供恒定时间 move ,并且 (b) copy-and-swap 提供单行代码中的异常安全性和近乎最佳的性能。

关于c++ - pass-by-value-and-then-move 结构是一个坏习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21035417/

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