【问题标题】:std::list erasing (free memory)std::list 擦除(空闲内存)
【发布时间】:2013-08-17 15:48:34
【问题描述】:
struct SomeStruct
{
};

class C
{
public:

    C()
    {
        for (int i = 0; i < 100; ++i)
        {
            m_List.push_back(new SomeStruct);
        }
    }

private:

    std::list<SomeStruct*> m_List;
};

两种析构函数变体中的哪一种更快(为什么?)释放内存:

~C()
{
    for (auto iter = m_List.begin(); iter != m_List.end(); ++iter)
    {
        delete *iter;
    }
}


~C()
{
    while (m_List.size() != 0)
    {
        delete *m_List.begin();

        m_List.pop_front();
    }
}

【问题讨论】:

  • 那些原始指针非常有问题。我建议只使用SomeStruct,直到证明您需要指针,然后使用智能指针。
  • 克里斯,我知道智能指针,这个问题不是关于如何存储指针,我只想让你选择一个析构函数并解释你为什么选择它。
  • @Edward83:我没有投反对票,但我能想到有人可能投反对票的几个原因。您正在使用原始指针。人们经常对他们认为通常是糟糕的代码 投反对票,在我的书中,这就是事实。您正在向我们询问两个sn-ps代码之间的性能差异,您应该做的是自己测试它。
  • 我真的怀疑性能差异对任何事情都很重要,并且由于首先不应使用此代码这一事实而无效。如果您非常担心性能,您可以使用(100, new SomeStruct) 来初始化列表,而不是使用push_backs 的显式循环。
  • 为什么是std::list&lt;SomeStruct*&gt; 而不是std::vector&lt;SomeStruct&gt;

标签: c++ performance destructor stdlist


【解决方案1】:

第一个更快。第二个是删除头部并删除它。您不需要显式删除列表元素。完整的列表无论如何都会被销毁,因为它是 C 的成员

【讨论】:

  • 第一个也将(隐式)擦除列表中的所有元素。您有什么证据表明这样做比明确执行要快?
  • 迭代列表两次会给 CPU 的缓存/内存带宽带来更多压力。另外,只是想知道,一个符合标准的实现不可能有一个 O(n) 的 size() 实现吗?
猜你喜欢
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
相关资源
最近更新 更多