Как дефрагментируется память в языках без сборщика мусора?
Как дефрагментируется память в языках без сборщика мусора
Как напишете - так и дефрагментируется. Если будете использовать стандартную кучу, то никак, поэтому постепенно будет расти потребление памяти, но, как правило оно будет стремиться с некоторому лимиту. Если это создает проблемы, то вариантов решения несколько:
- свой сборщик мусора с перемещением и дефрагментацией и реализация всех динамических объектов с использованием такого подхода
- реализация управления динамической памятью не приводящая к фрагментации, обычно с фиксированными размерами чанков, например на битмапах .
- минимизация запросов на выделение/освобождение динамической памяти, например, как уже упоминалось, через object pool'ы.Правильно ли я понимаю, что языкам со сборкой мусора нужно ровно в два раза больше оперативной памяти т.к. нужно куда-то перемещать свободные блоки? Или там от алгоритма зависит? Если да, то какой средний оверхэд? 
Сборка мусора не обязательно приводит к дефрагментации, дефрагментация происходит при перемещении. Перемещение обычно не требует никакого overhead'а.
Через allocator и object-pool.