Имея неправильную память, я не смог вычислить правильный размер памяти, которую я искал. Я не знаю почему - PullRequest
0 голосов
/ 02 ноября 2018

Имея в памяти некоторые воспоминания, я не смог вычислить правильный размер памяти, в которой я находился. Система сообщила мне, что у меня было 2 Гбайт, но мой код сказал мне, что я только что израсходовал 119 МБ. Я не знаю, что было неправильно.

#include <stdio.h>
#include <stdlib.h>
int main(void){
    long long size = 0;
    while(malloc(1) != NULL){
        size = size + 1;
    }
    long long res = size>>20;
    printf("%d MBytes\n",res);

    scanf("%d",&size);
    return 0;
}

image_res_1 image_res_2

1 Ответ

0 голосов
/ 02 ноября 2018

Код для malloc и free должен поддерживать структуры данных, отслеживая каждый блок памяти, который он вам дал. Давайте представим, что на каждый блок памяти приходится 16-байтовая структура данных, возвращаемая malloc. Вы сказали, что выделили 119 МБ, что, поскольку вы выделили 1-байтовые блоки, говорит о том, что у вас есть что-то вроде 124780544 блоков. Если каждый блок имеет 16 байтов служебной информации, то это 124780544 x 16 = 1996488704 байта служебной информации. 124780544 + 1996488704 = 2121269248, или примерно 2 ГБ.

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

Мораль в том, что выделение множества крошечных блоков памяти может быть довольно расточительным.

Если вы измените свою тестовую программу так, чтобы она выделяла блоки, скажем, по 1 Кб за раз, вы, вероятно, получите более приемлемый результат.

...