почему размер не указан в свободном утверждении [дубликат]

Возможный дубликат:
Программирование на C: как free узнает, сколько нужно освободить?

Hello All,

Как ОС узнает, сколько мне нужно размера свободный, когда мы определяем свободный (указатель). Я имею в виду, что мы не предоставляем никакого размера, только указатель на свободное заявление. Как внутренне управлять размером?

Спасибо, Neel

1
задан Community 23 May 2017 в 12:11
поделиться

3 ответа

Операционная система не имеет ни малейшего понятия, так как free - это не системный вызов. Однако ваша система распределения памяти библиотек C будет каким-то образом записывать размер, когда память была первоначально выделена с помощью malloc (), поэтому она знает, сколько освободить.

2
ответ дан 2 September 2019 в 22:19
поделиться

Размер хранится внутри распределителя, и указатель, который вы передаете для освобождения, используется для доступа к этим данным. Самый простой подход - сохранить размер 4 байта перед указателем, поэтому вычитание 4 из указателя дает указатель на его размер.

Обратите внимание, что ОС не обрабатывает это напрямую, это реализуется вашим распределителем времени выполнения C / C ++.

0
ответ дан 2 September 2019 в 22:19
поделиться

Когда вы вызываете malloc, библиотека C автоматически выделяет для вас место на куче. Поскольку объекты, создаваемые на куче, создаются динамически, то, что находится на куче в любой момент времени, не известно, как это происходит со стеком. Поэтому библиотека будет отслеживать всю память, которую вы выделили на куче.

В какой-то момент ваша куча может выглядеть следующим образом:

              p---+
                  V
    ---------------------------------------
... |  used (4) | used (10) | used (8)    | ...
    ---------------------------------------

Библиотека будет отслеживать, сколько памяти выделено для каждого блока. В данном случае указатель p указывает на начало среднего блока.

Если мы выполним следующий вызов:

free(p);

то библиотека освободит для вас это место на куче, как показано ниже...

              p---+
                  V
    ----------------------------------------
... |  used (4) | unused(10) | used (8)    | ...
    ---------------------------------------- 

Теперь, в следующий раз, когда вы будете искать свободное место, скажем, с помощью вызова типа:

void* ptr = malloc(10);

Новое неиспользуемое место может быть снова выделено вашей программе, что позволит нам уменьшить общий объем памяти, используемой нашей программой.

            ptr---+
                  V
    ----------------------------------------
...  |  used (4) | used(10) | used (8)    | ...
    ---------------------------------------- 

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

bytes: 1   4    1    10   1   8
     --------------------------------
 ...  |4| used |10| used |8| used | ...
     -------------------------------- 
                   ^
                   +---ptr

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

Когда мы передаем указатель в free:

free(ptr);

Библиотека переместит переданный указатель на один байт назад и изменит бит used/unused на unused. В этом конкретном случае нам даже не нужно знать размер блока, чтобы освободить его. Это становится проблемой, только когда мы пытаемся перераспределить тот же объем данных. Тогда вызов malloc будет идти вниз по строке, проверяя, свободен ли следующий блок. Если он свободен, то при правильном размере блок будет возвращен пользователю, в противном случае новый блок будет вырезан в конце кучи, и при необходимости ОС выделит больше места.

0
ответ дан 2 September 2019 в 22:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: