我一直在为 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 许可协议
是的,这是非常安全的:
pop()
对 --- 中的第一个元素没有任何先决条件q
具有指定状态,并且由于您随后没有使用q.front()
您没有必须处理该对象已失效。听起来是个好主意!