std :: deque内存使用

时间:2011-06-28 13:28:32

标签: c++ memory stl deque

我已经实现了一个简单的统计引擎,使用deque返回滚动均值和方差,以提供数据队列。

deque的构造有许多条目,等于滚动的数值。

当新值到达时,最前面的值会弹出前面,而新值会被推到后面。

我需要确保这不会在内存中增长,因为它预计会在很长一段时间内作为后台任务运行。

deque是否在使用中的堆上分配? 我可以使用标志来确定它的大小吗?

我在RHEL 5.3上使用G ++ 4.1.2

3 个答案:

答案 0 :(得分:8)

基本上,任何动态大小的容器都会从堆中分配内存。另一个问题是overview over the implementation of the deque

但在您的特定情况下,队列始终具有相同的大小。如果遇到deque问题,在固定大小的数组上使用circular buffer实现一个简单的固定大小队列可能是有益的。这种实现应该具有从根本上更好的内存行为(因为它永远不需要重新分配)。如果没有分析数据,它的优势是否值得实施的麻烦很难评估。

答案 1 :(得分:2)

正如小费一样,如果您不需要跟踪值,那么这个非常轻量级的算法(我甚至在8位微处理器上使用它)并且是准确的。

 class RunningStat
{
public:
    RunningStat() : m_n(0) {}

    void Clear()
    {
        m_n = 0;
    }

    void Push(double x)
    {
        m_n++;

        // See Knuth TAOCP vol 2, 3rd edition, page 232
        if (m_n == 1)
        {
            m_oldM = m_newM = x;
            m_oldS = 0.0;
        }
        else
        {
            m_newM = m_oldM + (x - m_oldM)/m_n;
            m_newS = m_oldS + (x - m_oldM)*(x - m_newM);

            // set up for next iteration
            m_oldM = m_newM; 
            m_oldS = m_newS;
        }
    }

    int NumDataValues() const
    {
        return m_n;
    }

    double Mean() const
    {
        return (m_n > 0) ? m_newM : 0.0;
    }

    double Variance() const
    {
        return ( (m_n > 1) ? m_newS/(m_n - 1) : 0.0 );
    }

    double StandardDeviation() const
    {
        return sqrt( Variance() );
    }

private:
    int m_n;
    double m_oldM, m_newM, m_oldS, m_newS;
};

该算法由B. P. Welford创建,并在Donald Knuth的计算机编程艺术,第2卷,第232页,第3版中呈现。

http://www.johndcook.com/standard_deviation.html

答案 2 :(得分:0)

规范将实现细节留给供应商。但是,由于两端的插入是有效的,因此很可能在堆上实现为链接结构。话虽这么说,当你从堆中弹出一些东西时,它应该被解构,所以你的总内存使用量不应该攀升。