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

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

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

([PDF ПРЕДУПРЕЖДЕНИЕ] Теоретическая статья о Предложение С++ 0x для сборщика мусора Boehm)

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

HnxGC http://hnxgc.harnixworld.com/

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

Ответ 8

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

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

Ответ 9

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

Выводы

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

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

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