Возможно ли, что вы используете Debug исполняемые файлы?252MB для 100M символов кажется большим ...
Вы можете проверить приписывание этого, используя umdh , чтобы сделать снимок до и после, а затем сравнить два - может пролить свет на то, почему этобольше, чем вы ожидали.
РЕДАКТИРОВАТЬ: FYI - Когда я запускаю это вне отладчика на VS2010, я получаю 181 МБ с char
с.
deque<char> mydequeue;
for (size_t i = 0; i < 100 * 1024 * 1024; ++i)
{
mydequeue.push_back(char(i));
}
РЕДАКТИРОВАТЬ: Поддержка другого ответа от @Диалектика, это дает мне ту же площадь, что и double
:
struct twoInt64s
{
public:
twoInt64s(__int64 _a, __int64 _b) : a(_a), b(_b) {}
__int64 a;
__int64 b;
};
РЕДАКТИРОВАТЬ: С _DEQUESIZ
, измененным, как показано (128 символов на блок), 100 миллионов символов теперь занимают 113M памяти.
Мой вывод состоит в том, что оставшиеся накладные расходы, которые вы видели, связаны со структурами управления для блоков deque
, которые имеют 16 символов данных, плюс управляющая информация для deque
плюс дополнительная управляющая информация для менеджера кучи.
#define _DEQUESIZ (sizeof (value_type) <= 1 ? 128 \
: sizeof (value_type) <= 2 ? 8 \
: sizeof (value_type) <= 4 ? 4 \
: sizeof (value_type) <= 8 ? 2 \
: 1) /* elements per block (a power of 2) */
Мораль - если вы действительно хотите оптимизировать это для своих особых целей, будьте готовы играть с <deque>
.Его поведение критически зависит от размера ваших элементов, а также от ожидаемого шаблона использования.
РЕДАКТИРОВАТЬ: В зависимости от ваших знаний о размерах очереди, вы можете включить boost :: циркуляр_buffer. в качестве замены контейнера std :: queue.Могу поспорить, что это будет работать так, как вы хотите (и ожидаете).