it-swarm-ru.tech

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

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

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

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

65
Andrew Bettison

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

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

27
Greg Hewgill

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

22
Tom Leys

Я часто использую Boehm-GC. Он прост в использовании, но документация действительно плохая. Есть страница на C++, но ее довольно сложно найти.

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

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

9
Paul Biggar

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

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

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

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

9
Pieter

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

Вот почему Boehm GC часто предлагается.

2
Arafangion

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

2
larsivi

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

HnxGC http://hnxgc.harnixworld.com/

В свое время был также продукт под названием Great Circle от Geodesic Systems, но, похоже, они его больше не продают. Понятия не имею, продан ли продукт кому-либо еще.

1
Daniel Holmes

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

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

1
Remi Lemarchand

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

Выводы

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

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

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

1
the_drow