gpt4 book ai didi

c++ - 将结构元素转换为 const-reference 可以节省一些开销吗?

转载 作者:行者123 更新时间:2023-11-28 07:01:35 25 4
gpt4 key购买 nike

场景,

我有一个包含数千个“条目”(我称它们为“滴答”)的跟踪文件。每个“条目”包含几行信息。有两种类型的信息(位置数据和多播数据),所以每一行都是关于“位置”或“多播”的。

目标:我的目标是将它们有效地存储到我的数据结构中:

实现:

为了存储每个条目的信息,我有:

//////////////////
struct multicast_data{
//... integers, vectors of integers, string etc.
}
std::list<multicast_data> multicasts;
///////////////////////
struct AgentLocation{
//... integers, operator overload etc.
};
std::set<AgentLocation> agentsLocation;
////////////////////////

接下来,我想将条目存储在队列中,所以我首先将它们捆绑在另一个结构中,如下所示:

struct tickDataBundle{
const std::list<multicast_data> & multicasts;
const std::set<AgentLocation> & agentsLocation;
tickDataBundle(const std::list<multicast_data> &multicasts,
const std::set<AgentLocation> &agentsLocation):
multicasts(multicasts),
agentsLocation(agentsLocation){}
};

然后我将它们放入队列中:

MessageQueue<tickDataBundle> m_processed_data;

问题:

  1. 我的困惑是,tickDataBundle 中的容器(列表和集合)在某些方法的范围内创建和填充,当范围结束时(无堆),这些容器自然会被销毁。因此,即使返回对这些容器的引用也会创建悬挂引用。所以我想如果在范围结束之前,我添加 const-reference这些容器的 tickDataBundle对象,然后将此对象推送到 MessageQueue ,我会受益于 C++ 的优化,以防止整个容器被破坏并减少一些复制开销。这是一个正确有效的假设吗?
  2. 为什么我不能保存 tickDataBundle 的常量引用在上面的队列中?(MessageQueue<const tickDataBundle&> m_processed_data; 产生错误)

谢谢

更新:这部分仅供您引用我在抄我的 MessageQueue 的结构和如果我声明 MessageQueue<const tickDataBundle&> m_processed_data; 我会得到的错误

template<class T>
class MessageQueue {
std::queue<T> messageList;
boost::shared_mutex mutex;
public:
MessageQueue();
virtual ~MessageQueue();
bool ReadMessage();
void post(T message);
bool pop(T&);
void clear();
int size();
};

错误:

In file included from /usr/include/c++/4.8/deque:64:0,
from /usr/include/c++/4.8/queue:60,
from ./ns3/drop-tail-queue.h:22,
from ./ns3/network-module.h:24,
from ../src/simmobility/examples/simmobility-RR-baseline.cc:2:
/usr/include/c++/4.8/bits/stl_deque.h: In instantiation of ‘class std::_Deque_base<const sim_mob::RoadRunnerBaseLine::tickDataBundle&, std::allocator<const sim_mob::RoadRunnerBaseLine::tickDataBundle&> >’:
/usr/include/c++/4.8/bits/stl_deque.h:730:11: required from ‘class std::deque<const sim_mob::RoadRunnerBaseLine::tickDataBundle&, std::allocator<const sim_mob::RoadRunnerBaseLine::tickDataBundle&> >’
/usr/include/c++/4.8/bits/stl_queue.h:96:46: required from ‘class std::queue<const sim_mob::RoadRunnerBaseLine::tickDataBundle&, std::deque<const sim_mob::RoadRunnerBaseLine::tickDataBundle&, std::allocator<const sim_mob::RoadRunnerBaseLine::tickDataBundle&> > >’
./ns3/smb_message_queue.h:18:16: required from ‘class sim_mob::MessageQueue<const sim_mob::RoadRunnerBaseLine::tickDataBundle&>’
./ns3/smb_roadrunner_baseline.h:87:47: required from here
/usr/include/c++/4.8/bits/stl_deque.h:448:60: error: forming pointer to reference type ‘const sim_mob::RoadRunnerBaseLine::tickDataBundle&’
typedef _Deque_iterator<_Tp, _Tp&, _Tp*> iterator;
^
/usr/include/c++/4.8/bits/stl_deque.h:449:60: error: forming pointer to reference type ‘const sim_mob::RoadRunnerBaseLine::tickDataBundle&’
typedef _Deque_iterator<_Tp, const _Tp&, const _Tp*> const_iterator;
^
/usr/include/c++/4.8/bits/stl_deque.h:488:61: error: forming pointer to reference type ‘const sim_mob::RoadRunnerBaseLine::tickDataBundle&’
typedef typename _Alloc::template rebind<_Tp*>::other _Map_alloc_type;
AND THE ERROR CONTINUES...

最佳答案

1。我想如果我对 tickDataBundle 中的元素进行常量引用,它会减少一些复制开销。这是一个正确有效的假设吗?

答案是肯定的。 tickDataBundle 对象的所有拷贝仅拥有 multicastsagentsLocation 的 const 引用,不处理其中的真实数据。

*2。为什么我不能在上面的队列中保存一个 tickDataBundle 的常量引用? (MessageQueue m_processed_data; 产生错误)*

const 引用必须在对象构造时间点分配。您可以使用const pointer 作为const reference,像这样:

MessageQueue<const tickDataBundle*> m_processed_data;

关于c++ - 将结构元素转换为 const-reference 可以节省一些开销吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22394923/

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