【问题标题】:What are the most common places that move semantics is used in C++11 STL?C++11 STL 中最常使用移动语义的地方是什么?
【发布时间】:2017-07-06 17:48:38
【问题描述】:

我知道std::vector<T>::push_back() 支持移动语义。因此,当我将命名的临时实例添加到向量时,我可以使用std::move()

STL中还有哪些常见的地方我应该养成添加std::move()的习惯

【问题讨论】:

  • “命名为临时”? emplace_back(some_type{..}) 只会做正确的事(优化后)。

标签: c++11 stl move-semantics


【解决方案1】:

我知道std::vector<T>::push_back() 支持移动语义。

push_back 的支持只是一个额外的重载,它采用 右值引用,因此可以通过调用 T(T&&) 而不是 @ 来构造向量内的新值 T 987654325@。优点是前者可以更有效地实现,因为它假定传递的 rvalue 引用 以后永远不会被使用。

大多数标准库容器都为其 push/enqueue/insert 成员函数添加了类似的重载。此外,emplacement 的概念已被添加(例如std::vector<T>::emplace_back,其中值在容器内适当地构造以避免不必要的临时性。放置应该优先于插入/推送。


因此,当我将命名的临时实例添加到向量时,我可以使用std::move()

“命名临时”并没有多大意义。这个想法是你有一个你不再关心的左值,你想用std::move把它变成一个临时的。示例:

Foo foo;
some_vector.emplace_back(std::move(foo));
// I'm sure `foo` won't be used from now on

请记住 std::move 并不特殊:它的字面意思是 static_cast<T&&>


我应该养成在 STL 中添加std::move 的习惯的其他常见位置是什么?

这是一个非常广泛的问题 - 您应该在任何有意义的地方添加 std::move,而不仅仅是在标准库的上下文中。如果你有一个 lvalue 你知道你不会再在特定的代码路径中使用它,并且你想将它传递/存储在某个地方,然后std::move 它。

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 2012-08-20
    • 2019-02-20
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    相关资源
    最近更新 更多