Вызывает ли new / malloc перестановку памяти в среде достаточной, но фрагментированной памяти? - PullRequest
1 голос
/ 05 апреля 2019

Это просто из любопытства.

Например, допустим, мы израсходовали 2 из 8 байтов памяти:

[xx------]

Если я вызываю new / malloc, запрашивая 3байт, он должен работать просто отлично, возможно, вот так:

[xx--xxx-]

Что произойдет, если я вызову new / malloc, запрашивая еще 3 байта?С точки зрения доступной памяти, есть еще 3 свободных байта, даже если они не являются смежными.Будет ли программа «дефрагментировать» память, чтобы освободить место для нового выделения?Звучит невозможно, так как я все еще держусь за ссылки на существующие ресурсы.

Если это так, то в крайнем случае, если ваша память как-то заканчиваетсясупер фрагментированный (например, каждый второй байт выделен ala [x-x-x-x- x-x-x-x-]), означает ли это, что я не могу выделить даже 2 байта, несмотря на 50% свободной памяти?

Не думаю, что платформа имеет значение?

Извините за расширенный вопрос, но произойдет ли это и на других языках, таких как Java / C #?

1 Ответ

0 голосов
/ 05 апреля 2019

Правильно, память может стать настолько фрагментированной, что выделение памяти больше невозможно.Хороший распределитель объединит освобожденные блоки, когда это возможно, чтобы ограничить фрагментацию.

Управляемая среда MS .NET решает эту проблему путем косвенного выделения блоков памяти, то есть с помощью указателя на указатель на блок.Таким образом, блок может быть перемещен для дефрагментации памяти без изменения указателя на указатель.(Платформа позаботилась о том, чтобы избежать проблем параллелизма, потому что .NET имеет сборщик мусора, работающий асинхронно.)

...