【发布时间】:2016-09-07 12:11:03
【问题描述】:
我一直在为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 对象的通用解决方案,还是我应该做其他事情?
【问题讨论】:
-
是的,移动它是安全的,只要唯一你用它做的事情就是弹出它
-
@SteveLorimer 或重新分配它。或者在没有前提条件的情况下进行任何其他操作。
-
@Revolver_Ocelot 赋值不一定没有前提。
-
这些预防措施适用于任何时候移动对象。与队列弹出无关。
标签: c++ c++11 boost stl optional