Моя точка зрения заключается в том, что GC уступает malloc, когда вы выполняете нормальное процедурное программирование.Вы просто переходите от процедуры к процедуре, выделяете и освобождаете, используете глобальные переменные и объявляете некоторые функции _inline или _register.Это стиль C.
Но как только вы поднимитесь на более высокий уровень абстракции, вам понадобится как минимум подсчет ссылок.Таким образом, вы можете пройти по ссылке, сосчитать их и освободить, если счетчик равен нулю.Это хорошо и превосходит malloc после того, как количество и иерархия объектов становятся слишком сложными для ручного управления.Это стиль C ++.Вы будете определять конструкторы и деструкторы для приращения счетчиков, вы будете копировать при изменении, поэтому общий объект будет разделен на две части, как только какая-то его часть будет изменена одной стороной, но другой стороне все еще нужно исходное значение.Таким образом, вы можете передавать огромное количество данных из функции в функцию, не думая, нужно ли вам копировать данные здесь или просто отправить указатель туда.Подсчет ссылок принимает эти решения за вас.
Затем наступает целый новый мир, замыкания, функциональное программирование, типирование утки, циклические ссылки, асинхронное выполнение.Код и данные начинают смешиваться, вы обнаруживаете, что передаете функцию в качестве параметра чаще, чем обычные данные.Вы понимаете, что метапрограммирование может быть сделано без макросов или шаблонов.Ваш код начинает впитываться в небо и теряет твердую почву, потому что вы выполняете что-то внутри обратных вызовов обратных вызовов обратных вызовов, данные становятся неутвержденными, вещи становятся асинхронными, вы зависимы от переменных закрытия.Так что именно в этом случае основанный на таймере GC с обходом памяти является единственным возможным решением, в противном случае замыкания и циклические ссылки вообще невозможны.Это способ JavaScript.
Вы упомянули D, но D все еще улучшен в C ++, поэтому вероятно, что malloc или подсчет ссылок в конструкторах, выделение стека, глобальные переменные (даже если они являются сложными деревьями сущностей всех видов)Вы выбираете.