Сбор мусора Библиотеки в C ++

Какие бесплатные и коммерческие библиотеки сбора мусора доступны для C ++, и каковы плюсы и минусы каждого из них?

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

Нет необходимости разрабатывать обычные компромиссы, связанные с автоматической сборкой мусора, но, пожалуйста, укажите используемые алгоритмы (подсчет ссылок, отметка и развертка, инкрементный и т. Д.) И кратко суммируйте последствия.

    Я с успехом использовал коллекцию Boehm в прошлом. Это с открытым исходным кодом и может использоваться в коммерческом программном обеспечении.

    Это консервативный коллекционер и имеет долгую историю развития одним из ведущих исследователей в области технологии сбора мусора.

    У Boost есть большой набор интеллектуальных указателей, которые include подсчет ссылок на ссылки или удаление на область видимости или интрузивный подсчет ссылок. Это оказалось достаточно для наших нужд. Большим плюсом является то, что все это бесплатно, с открытым исходным кодом, с шаблоном C ++. потому что это подсчет ссылок, в большинстве случаев он очень детерминирован, когда объект уничтожается.

    Сборщик мусора Boehm свободно доступен, и, предположительно, неплохо (без первого опыта)

    ([PDF WARNING] Теоретическая статья о предложении C ++ 0x для сборщика мусора Boehm )

    Первоначально было сказано, что он делает C ++ 0x , но не сделает его в конце концов (из-за ограничений по времени, я полагаю).

    Proprosal N2670 (минимальная поддержка сборщиков мусора) получил одобрение в июне 2008 года, хотя, поскольку реализация компилятора подбирает это, и стандарт завершается, мир сбора мусора там для C ++ обязательно изменится …

    Я использую boehm-gc много. Это прямолинейно, но документация очень плохая. Существует страница C ++, но ее довольно сложно найти.

    В основном, вы просто убедитесь, что каждый class наследует их базовый class и что вы всегда передаете gc_allocator в контейнер. В ряде случаев вы хотите использовать libgccpp для поиска других видов использования новых и удаления. В основном это изменения высокого уровня, и мы обнаруживаем, что мы можем отключить GC во время компиляции с помощью #ifdef, и что поддержка этого влияет только на один или два файла.

    Моя основная проблема заключается в том, что вы больше не можете использовать Valgrind, если сначала не выключите коллекционер. Хотя выключение коллектора легко и не требует перекомпиляции, его невозможно использовать, если у вас закончится нехватка памяти.

    Единственный, кого я знаю, это Бем, который на дне является традиционной меткой и разверткой. Вероятно, он использует различные методы для оптимизации, но обычно инкрементные / генерационные / уплотняющие GC будут трудно создавать для C ++, не перейдя на управляемое подмножество, например, что вы можете получить с .Net C ++. Некоторые из подходов, требующих перемещения указателей, могут быть реализованы с поддержкой компилятора для указателей пиннинга или блоков чтения / записи, но эффект на производительность может быть слишком большим, и это не обязательно нетривиальные изменения в GC.

    Основная трудность с GC в C ++ заключается в необходимости обрабатывать несовместимые модули в смысле GC. т.е. иметь дело с библиотеками, которые никогда не были написаны с учетом ГК.

    Вот почему часто предлагается БЭМ.

    Вот коммерческий продукт, который я нашел в поиске этой же вещи

    HnxGC http://hnxgc.harnixworld.com/

    В тот же день был выпущен продукт под названием «Великий круг» из геодезических систем, но не похоже, что они продают его больше. Не знаю, продал ли продукт кому-либо еще.

    Вы также можете использовать Microsoft Managed C ++. CLR и GC очень прочные и используются в серверных продуктах, но вы должны использовать CLR-типы для GC, которые собираются на самом деле – вы не можете просто перекомпилировать существующий код и удалить все инструкции delete.

    Я бы предпочел использовать C # для написания совершенно нового кода, но Managed C ++ позволяет вам быстрее развивать свою базу кода.

    Прочтите это и внимательно посмотрите на выводы:

    Выводы

    • Комплексное решение проблемы, для которой простые решения широко используются и будут улучшены с помощью C ++ 0x, оставит нам мало потребности.
    • У нас мало опыта работы с рекомендуемыми языковыми функциями, которые должны быть стандартизированы.
    • Фиксация плохой программной комплексной системы никогда не будет работать.
    • Рекомендовать незначительные изменения языка для улучшения поддержки в будущем GC – запретить скрытие указателей (трюк списка xor) в качестве одного из примеров.

    • Наконец – адрес «C ++ – это плохо, потому что у него нет аргумента GC». C ++ не генерирует мусор и поэтому не нуждается в GC . Очевидно, что Java, C #, Objective C и т. Д. Генерируют много мусора.

    Да последнее предложение является субъективным, а также частью священных войн.
    Я использую C ++, потому что мне не нравится идея, что кто-то должен вынуть мусор для меня.
    Ратуша делает это, и этого достаточно для меня.
    Если вам нужен GC, используйте другой язык. Выберите подходящий инструмент для правильной работы.

    Давайте будем гением компьютера.