2012-04-21 5 views
4

Я выделяю некоторое пространство с помощью malloc при запуске приложения. Если я не заполняю эту переменную top, она показывает 0% моей памяти, используемой этим приложением, но если я начну заполнять эту вершину переменной, она начнет показывать увеличение использования ram, как я заполняю этот массив.C malloc, использование памяти только при заполнении

Так что мой вопрос: не следует ли показывать это пространство, выделенное malloc, как используемое пространство моего приложения? Почему это только показывает увеличение использования ОЗУ из моего приложения, когда я заполняю эту переменную?

Я нахожусь в Ubuntu 10.10 64 бит. Вот код, который его заполняет:

char pack(uint64_t list, char bits, uint64_t *list_compressed, char control, uint64_t *index){ 
uint64_t a, rest; 

if(control == 0){ 
    a = list; 
} 
else{ 
    rest = list >> (64 - control); 

    a = (control == 64 ? list_compressed[*index] : list_compressed[*index] + (list << control)); 

    if(control + bits >= 64){ 
     control = control - 64; 
     //list_compressed[*index] = a; 
     (*index)++; 
     a = rest; 
    } 
} 

//list_compressed[*index] = a; 
control = control + bits; 

return control; 
} 

Переменная «malloqued» является list_compressed.

Если я раскомментирую список_сжатой совокупности, то использование ram увеличивается, если я прокомментирую использование 0%.

+0

http://en.wikipedia.org/wiki/Virtual_memory –

ответ

6

Короткий ответ, нет. Во многих ОС, когда вы вызываете malloc, он напрямую не выделяет вам память, но только при ее доступе.

От mallocman page:

По умолчанию Linux следует оптимистической стратегии распределения памяти. Это означает, что когда malloc() возвращает не-NULL, нет гарантии , что память действительно доступна.

+0

Какая ОС, отличная от Linux, оптимизирует распределение памяти и имеет аналог OOM Killer? –

+0

@JonathanLeffler - AFAIK, задержка с распределением памяти, пока фактическое использование не будет выполнено в Windows и iOs (но я могу ошибаться ...) – MByD

2

Современные операционные системы могут просто вернуть адрес виртуальной памяти при выделении, что фактически не указывает на кусок памяти. Он только «выделяется», когда вы хотите его использовать.

+0

Это имеет смысл. Итак, как я могу узнать, сколько памяти было фактически выделено? –

Смежные вопросы