首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将结构元素转换为const引用可以节省一些开销吗?

将结构元素转换为const引用可以节省一些开销吗?
EN

Stack Overflow用户
提问于 2014-03-14 02:16:46
回答 1查看 121关注 0票数 0

场景,

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

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

Implementation:

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

代码语言:javascript
复制
//////////////////
struct multicast_data{
//... integers, vectors of integers, string etc.
}
std::list<multicast_data> multicasts;
///////////////////////
struct AgentLocation{
 //... integers, operator overload etc.
};
std::set<AgentLocation> agentsLocation;
////////////////////////

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

代码语言:javascript
复制
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){}
    };

然后我把他们排成一队:

代码语言:javascript
复制
MessageQueue<tickDataBundle> m_processed_data;

问题:

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

谢谢

更新:此部分仅供您参考--,我正在复制MessageQueue的结构和如果声明MessageQueue<const tickDataBundle&> m_processed_data;时会遇到的错误

代码语言:javascript
复制
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();
};

错误:

代码语言:javascript
复制
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...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-14 02:45:01

1.我想如果我引用tickDataBundle中的元素,就会减少一些复制开销。这是一个正确而有效的假设吗?

答案是肯定的。所有tickDataBundle对象的副本都只拥有multicastsagentsLocation的引用,而不是处理真实的数据。

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

必须在对象构造时间点分配const引用。您可以使用const指针作为const引用,如下所示:

代码语言:javascript
复制
MessageQueue<const tickDataBundle*> m_processed_data;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22394923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档