如果您要从队列中弹出对象,可以从队列中“移动”一个对象吗?

新手上路,请多包涵

我一直在为 commands (它们是大型数据数组的精美包装器)开发一个解析器,并且有一个未处理命令所在的队列。如果我需要一个命令,我会使用如下代码查询它:

 boost::optional<command> get_command() {
    if (!has_command()) return boost::optional<command>(nullptr);
    else {
        boost::optional<command> comm(command_feed.front()); //command_feed is declared as a std::queue<command>
        command_feed.pop();
        return comm;
    }
}

问题是,在适当的情况下,这些命令的大小可能是兆字节,并且需要非常快速地解析。我的想法是,我可以将转移优化为这样的移动:

 boost::optional<command> get_command() {
    if (!has_command()) return boost::optional<command>(nullptr);
    else {
        boost::optional<command> comm(std::move(command_feed.front())); //command_feed is declared as a std::queue<command>
        command_feed.pop();
        return comm;
    }
}

它似乎适用于这种特定情况,但这可以用作任何正确维护的 RAII 对象的通用解决方案,还是我应该做其他事情?

原文由 Xirema 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 838
2 个回答

是的,这是非常安全的:

 std::queue<T> q;
// add stuff...

T top = std::move(q.front());
q.pop();

pop() 对 --- 中的第一个元素没有任何先决条件 q 具有指定状态,并且由于您随后没有使用 q.front() 您没有必须处理该对象已失效。

听起来是个好主意!

原文由 Barry 发布,翻译遵循 CC BY-SA 3.0 许可协议

的。只要您的 std::queue 的容器模板参数确保其包含的值的状态没有前提条件 pop_front()std::queue 的默认值为 std::deque 并且提供了保证。

只要您确保我在上一段中写的内容,您就完全安全。您即将从队列中删除该项目,因此没有理由不将其移出,因为您 拥有 该对象的所有权。

原文由 user2296177 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题