Почему программа VC ++, хранящая 5 МБ данных, должна потреблять 64 МБ системной памяти?

Я пытался выяснить, почему моя программа потребляет так много системной оперативной памяти. Я загружаю файл с диска в вектор структур из нескольких динамически выделяемых массивов. Согласно диспетчеру задач, файл размером 16 МБ в конечном итоге занимает 280 МБ системной оперативной памяти. Типы в файле - это в основном символы с короткими и длинными. В файле 331 000 записей, содержащих в среднем около 5 полей. Я преобразовал вектор в структуру, и это уменьшило объем памяти примерно до 255 МБ, но это все еще кажется очень большим. Поскольку вектор занимает так много памяти, программе не хватает памяти, поэтому мне нужно найти способ сделать использование памяти более разумным.

Я написал простую программу, чтобы просто заполнить вектор (или массив) 1 000 000 символов. указатели. Я ожидал, что он будет выделять 4 + 1 байт для каждого из 5 МБ памяти, необходимой для хранения, но на самом деле он использует 64 МБ (версия массива) или 67 МБ (векторная версия). Когда программа запускается в первый раз, она потребляет всего 400 КБ, так почему же дополнительно выделяются 59 МБ для массива или 62 МБ для выделяемых векторов? Кажется, что эта дополнительная память предназначена для каждого контейнера, поэтому, если я создам size_check2, скопирую все и запустю его, программа использует 135 МБ для 10 МБ указателей и данных.

Заранее спасибо,

size_check.h

#pragma once

#include <vector>

class size_check
{
public:
    size_check(void);
    ~size_check(void);

    typedef unsigned long   size_type;

    void stuff_me( unsigned int howMany );

private:
    size_type**         package;
//  std::vector<size_type*> package;
    size_type*          me;
};

] size_check.cpp

#include "size_check.h"

size_check::size_check(void)
{
}

size_check::~size_check(void)
{
}

void size_check::stuff_me( unsigned int howMany )
{
    package = new size_type*[howMany];
    for( unsigned int i = 0; i < howMany; ++i )
    {

        size_type *me = new size_type;
        *me = 33;
        package[i] = me;
//      package.push_back( me );
    }
}

main.cpp #include "size_check.h"

int main( int argc, char * argv[ ] )
{
    const unsigned int buckets = 20;
    const unsigned int size = 50000;

    size_check* me[buckets];

    for( unsigned int i = 0; i < buckets; ++i )
    {
        me[i] = new size_check();
        me[i]->stuff_me( size );
    }
    printf( "done.\n" );
}
5
задан Mark 12 June 2011 в 05:09
поделиться