【问题标题】:Empty deque versus unused pointer to deque空双端队列与未使用的双端队列指针
【发布时间】:2013-05-21 06:51:35
【问题描述】:

如果将参数传递给构造函数,我有一个类有时需要使用deque<int> 类型的成员,如果不是,则不会使用该成员。什么是有效和风格化地处理这种情况的最佳方法?

我还想提一下,这个类的对象应该能够传递给同一个函数,尽管删除在同一个容器中存储的能力很好。我从未做过多态性(正如 cmets 中所暗示的那样),但我想我会阅读并尝试一下。

我的两个想法:
- 将成员变量保留为deque<int>,我假设它将存储为空的deque<int>
- 使用指向deque<int> 的指针,仅在需要时调用new

【问题讨论】:

  • 除非您制作大量这些,否则请保持简单。在有需求之前不要优化。确保代码有效且易于理解是最重要的。也就是说,自己制作,不需要就不要使用。
  • 我明白你的意思,但这是一个简单的类,在我正在编写的其他类中可能被创建了数千万次。
  • 我也喜欢漂亮的代码:)
  • 首先找到sizeof(std::deque<int>),然后查看优化后生成的程序集,以构造和销毁一个空的deque。你可能会感到惊讶。
  • 嗯。 “如果将参数传递给构造函数”...如果您在创建每个对象时知道该对象是否需要deque,这可能是多态性的工作。

标签: c++ deque


【解决方案1】:

您正在寻找的正是boost::optional<deque<int>>。没有什么比这里更清楚、更准确地记录您的意图了。

【讨论】:

    【解决方案2】:

    如果性能是一个问题,我可能会使用选项 1 以及“is_initialized”布尔标志:

    class A
    {
      bool is_initialized;    
      public:
         A(bool used=false):is_initialized(used)  
         {
         }; 
      private:
         deque<int> _d;
    };
    

    是的,当不使用 deque 时,您可以使用选项 2 节省一点内存,但如果使用它,则会产生取消引用指针的开销。

    【讨论】:

      【解决方案3】:

      也可以在初始化使用时设置指向双端队列成员的指针:

      deque<int> queue_;
      deque<int> *ptr_;
      
      ptr_(NULL); // not used
      
      ptr_(&queue_);
      

      但是,在速度方面,如果您经常不使用队列,那么 new 可能会更快,因为默认情况下您会在指针中设置 NULL。如果使用 50/50,那么我的方法可能是最快的方法之一,因为您不需要处理更多堆。

      【讨论】:

        猜你喜欢
        • 2015-06-26
        • 2018-07-02
        • 2015-05-01
        • 2017-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-11
        • 2016-09-25
        相关资源
        最近更新 更多