gpt4 book ai didi

c++ - 如果您要从队列中弹出对象,可以从队列中取出 "Move"对象吗?

转载 作者:IT老高 更新时间:2023-10-28 22:17:02 31 4
gpt4 key购买 nike

我一直在为 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com