c++ - 将元素插入 std::queue 时避免复制

标签 c++ c++11 stl move

我是 c++11 的新手,想要一个 std::queue存储类 X 的实例并尽量避免在 push 中进行不必要的复制手术。在 c++11 中,我发现 push() 有一个右值引用版本:

void push (value_type&& val);

下面的实现也避免了不必要的 X

复制
std::queue<X> my_queue;

for (...) { // some for loop
  X x;
  ... // some initialization of x
  my_queue.push(std::move(x));
}

与以下天真的实现相比?

std::queue<X> my_queue;

for (...) { // some for loop
  X x;
  ... // some initialization of x
  my_queue.push(x);
}

最佳答案

自己回答此类问题的最佳方法是创建一个探测对象。

#include <iostream>
struct probe {
    probe() { std::cout << "probe()" << ((void*)this) << std::endl; }
    probe(const probe&) { std::cout << "probe(c&)" << ((void*)this) << std::endl; }
    probe(probe&&) { std::cout << "probe(&&)" << ((void*)this) << std::endl; }
    ~probe() { std::cout << "~probe()" << ((void*)this) << std::endl; }
};

并在测试中使用它代替 X。

我创建了一个 Playground here .

当您执行 std::move 时是否执行任何内容的额外拷贝完全取决于您在右值引用构造函数中键入的内容。

关于c++ - 将元素插入 std::queue 时避免复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21742341/

相关文章:

c++ - 我如何确定我是否可以将数组中的某些元素相加为 K?

c++ - 纯 C++ 代码比内联汇编程序快 10 倍。为什么?

c++ - std::unordered_map::operator[] - 为什么有两个签名?

c++ - 声明 RValue 方法(例如 void opera() &&;) virtual C++1x 有意义

c++ - 为什么迭代器没有被取消引用为左值

c++ - 数组 vs vector vs 列表

c++ - 将 QStringList 中的值设置为 QComboBox

c++ - 将 Nsight 设置为与现有 Makefile 项目一起运行

c++ - 如何使用 shared_ptr 避免悬挂指针?

c++ - 如何在列表初始化中添加额外的语句?