- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
由于我们在 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/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
我目前正在解析一个 token 队列:我没有为每个后续 pop() 检查队列是否为空,而是编写了一个 lambda 抛出异常,如果 queue.begin () == queue.end()。我想知道
目前,我正在通过一个 server.js 文件运行两个(很快会是三个)node.js websocket 应用程序。我正在使用 express 为我的整个页面以及我编写的粒子物理“游戏”提供服务。我也
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
将对象的属性用作映射条目的键是否是一种不好的做法?每次做都感觉不对。 例如: class Foo { String name; String bar; } 然后使用这样的 map : Foo
我是一名优秀的程序员,十分优秀!