std::取消内存使用
std::deque memory use
我实现了一个简单的统计引擎,使用deque提供数据队列来返回滚动平均值和方差。
deque由与值的滚动数相等的条目数构成。
当一个新值到达时,最旧的值会从前面弹出,新的值会推到后面。
我需要确保这不会在内存中增长,因为它预计将作为后台任务运行很长一段时间。
deque在使用中的堆上分配吗?是否有可以用来调整其大小的标志?
我在RHEL 5.3 上使用G++4.1.2
本质上,任何动态大小的容器都会从堆中分配内存。另一个问题概述了deque的实施情况。
但在您的特定情况下,队列总是具有相同的大小。如果您遇到deque的问题,那么在固定大小的数组上使用循环缓冲区来实现一个简单的固定大小队列可能是有益的。这个实现应该具有从根本上更好的内存行为(因为它从不需要重新分配)。如果没有分析数据,很难评估它的优势是否值得实施。
作为一个提示,如果你不需要跟踪值,有一个很棒的算法,它非常轻量级(我甚至在8bit micros上使用它),而且是准确的。
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
规范将实现细节留给供应商。然而,由于在两端插入是有效的,因此它很可能是作为堆上的链接结构来实现的。也就是说,当你从堆里弹出一些东西时,它应该被解构,所以你的总内存使用量不应该攀升。
相关文章:
- 为什么"std::uninitialized_copy"通常取消对未初始化内存的迭代器的引用不是未定
- 矢量迭代器不能与 std::shared_ptr<> 取消引用
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 如何取消设置 std::cout 精度?
- std::string::find 为取消引用的迭代器和等效字符串文本返回不同的值
- 为什么取消引用的指针指向指针的 std::cout 会导致 -fsanitize=地址投诉?
- 由 std::find() 返回的迭代器不可取消引用
- std::unique_ptr 在 try-catch 块中未捕获取消引用异常
- 如何放弃或取消 std::thread
- 干净取消在输入/输出调用中被阻止的 std::线程
- STD ::承诺外部代码,异步取消
- 取消 std::线程使用 native_handle() + pthread_cancel()
- 对 std::atomic::load 的结果使用结构取消引用 (->) 运算符是否安全
- 自定义 std::shared_ptr 或 boost::shared_ptr 以在 NULL 取消引用时引发异常
- std::condition_variable::wait()是POSIX线程取消点吗
- 如何取消初始化 std::实验::可选
- 在 std::vector 成员中取消分配数组
- 取消引用刚刚插入的 std::map 值有时会导致访问冲突
- 在取消引用的函数指针上使用时,std::is_function的求值结果为何为false
- 在“abcd”和“abc”的情况下,“std::equal”是否取消引用“end()”