использование памяти std :: deque - PullRequest
1 голос
/ 28 июня 2011

Я реализовал простой статистический механизм для возврата скользящего среднего и дисперсии, используя deque для предоставления очереди данных.

Deque создается с количеством записей, равным скользящему числу значений.

Когда приходит новое значение, самое старое значение выталкивается спереди, а новое - на спину.

Мне нужно быть уверенным, что это не будет увеличиваться в памяти, поскольку ожидается, что оно будет выполняться в качестве фоновой задачи в течение длительного времени

Распределяется ли deque в используемой куче? Есть ли флаги, которые я могу использовать, чтобы исправить его размер?

Я использую G ++ 4.1.2 на RHEL 5.3

Ответы [ 3 ]

8 голосов
/ 28 июня 2011

По существу, любой контейнер динамического размера выделяет память из кучи. Другой вопрос дает обзор реализации deque .

Но в вашем конкретном случае очередь всегда имеет одинаковый размер. Если вы сталкиваетесь с проблемами в очереди, может быть полезно реализовать простую очередь фиксированного размера, используя круговой буфер в массиве фиксированного размера. Эта реализация должна иметь принципиально лучшее поведение памяти (поскольку она никогда не требует перераспределения). Трудно оценить, стоит ли его преимущество от реализации, без профилирования данных.

2 голосов
/ 28 июня 2011

В качестве подсказки, если вам не нужно отслеживать значения, есть отличный алгоритм, который очень легкий (я даже использую его на 8-битных микросхемах) и точен.* Этот алгоритм был создан Б.П. Уэлфордом и представлен в книге «Искусство компьютерного программирования» Дональда Кнута, том 2, стр. 232, 3-е издание.

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

0 голосов
/ 28 июня 2011

Спецификация оставляет детали реализации поставщику. Однако, поскольку вставка на обоих концах эффективна, она, скорее всего, реализована в виде связанной структуры в куче. Тем не менее, когда вы вытаскиваете что-то из кучи, оно должно быть деконструировано, поэтому ваше общее использование памяти не должно расти.

...