doublench21
@doublench21

Верны ли мои рассуждения касаемо работы менеджера памяти?

Пусть изначально я выделяю следующий блок: (Все свободные блоки хранятся в списке)
||4||1.000.000|| = 1.000.004 байт (в первых четырех хранится размер)

Запрос на 10 байт:
Отдаю ||4||10|| = 14 байт
Пишу в ||10||
В списке сдвигаю на 14 байт и получаю ||4||999.990||

Запрос на 15 байт:
Отдаю ||4||15|| = 19 байт
Пишу в ||15||
В списке сдвигаю на 19 байт и получаю ||4||999.975||

Теперь отдаю 10 байт:
В списке получаю ||4||999.975|| -> ||4||10||

Запрос на 7 байт:
Отдаю ||4||7|| = 11 байт
Пишу в ||7||
В списке сдвигаю на 11 байт и получаю ||4||999.975|| -> ||4||3||

Верны ли мои рассуждения ?
  • Вопрос задан
  • 199 просмотров
Пригласить эксперта
Ответы на вопрос 1
maaGames
@maaGames
Погроммирую программы
Рассуждения не верны. Причины Три:
1. Разрядность операционной системы. Если брать х86 и х64, то вначале может быть выделен блок в 4 или 8 байт (иначе было бы невозможно выделить непрерывный блок боле 4 гигабайт).
2. Способ, которым выделялась память. Если выделял через new (молодец, возьми с полки пирожок), то перед блоком памяти записан размер этого блока. А если через malloc или аналогичную, то выделяется только блок памяти, без служебных данных.
3. В зависимости от настроек компилятора может быть добавлено ещё байтов в начале и в конце блока, содержащих некоторое флаговое значение, чтобы отслеживать ошибки выхода за границы массива.

А что ты там хранишь в списках и куда отдаёшь - я не понял. Если ты реализуешь свой диспетчер памяти, то можешь реализовать его так, как захочется.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы