作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我一直在为 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 对象的通用解决方案,还是我应该做其他事情?
最佳答案
是的,这是绝对安全的:
std::queue<T> q;
// add stuff...
T top = std::move(q.front());
q.pop();
pop()
对具有指定状态的 q
中的第一个元素没有任何先决条件,并且因为您随后没有使用 q .front()
您不必再处理该对象被无效了。
听起来是个好主意!
关于c++ - 如果您要从队列中弹出对象,可以从队列中取出 "Move"对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37173697/
我是一名优秀的程序员,十分优秀!