LINUX.ORG.RU

Garbage Collector для C++?

 


2

6

Какими решениями/библиотеками/фреймворками вы пользуетесь для сборки мусора в C++?

По идее ведь, каждый человек, который упарывается по сборке мусора, должен делать таковой велосипед для Крестов, но несмотря на это, фреймворков и информации очень мало..

Сылышал только о древнючем как создание жизни на Земле Boehm-Demers-Weiser. Есть всякие пулы типа того, что есть в Apache Portable Runtime, но это слишком убого - современные коллекторы типа G1 или Shenandoah в той же джаве умеют на пару порядков больше. То же касается велосипедных слаб аллокаторов и другой забавной копипасты со stackoverflow (кстати, есть где готовый продакшен-реди?). Думаю, что даже без прямой поддержки в синтаксисе языка, реализовать это на готовых инструментах возможно, собирая по кусочкам пулы, кастомные аллокаторы, трейсеры и раскрашиватели ссылок, итп

Так как в предыдущем вопросе о RTTR люди жаловались на отсутствие постановки цели, то вот Лекс лет так 7 назад описал Логику Неизбежности. Каждый кто начинает писать свой мемори менеджмент в конце концов доходит до написания GC в том или ином виде.

В качестве причин можно рассматривать как чистый перфоманс (перемещение выделенных объектов в куче, отложенное пакетизирование удаление с приоритетами), подкрепленный безумной сложностью реализации в одно рыло некоторых вещей (например многопоточности с учетом отсутствия приятной модели памяти), так и вопросы архитектуры приложения (лень писать поэтому вот цитата Донского из «Жизненного цикла программиста»):

«есть общие методические принципы создания программ, не вполне осознаваемые даже хорошими программистами. Примером может служить проблема принадлежности объектов друг другу, а также совмещение двух структур любой программы – иерархии вызова подпрограмм вместе с объектами, принадлежащих подпрограммам, и иерархии объектов по принадлежности друг другу. Примером отказа от самой идеи справиться с этими проблемами является наличие в некоторых языках механизма сборки мусора, что является молчаливым признанием возможности присутствия в среде объектов, не принадлежащих ни подпрограммам, ни другим объектам.»

Да, можно взять какой-нибудь Garbage Collection Handbook и пару пейперов, потратить два месяца (или два года?), и закодить велосипед - но зачем? Я уже видел эту дорогу (не на чистых крестах, а на крестах + джава, но это неважно), и не хочу ходить по ней второй раз, поэтому прошу достойных сэров экспертов Лора подобрать мне уже готовую GC-подобную систему для C++.

Подскажите что-нибудь? Шпасибо!

★★★★☆

Последнее исправление: stevejobs (всего исправлений: 2)

Стиви, вы уж не обижайтесь, но есть люди, для которых программирование на небезопасных нативных языках без GC противопоказано. В принципе. И не важно, будет ли это C, C++, Rust или даже Modula-2 с Ada.

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

Не ходите в С++, не ваше это.

eao197 ★★★★★
()

Ты хочешь программировать на жаве, тебе нравится жава и её сборщик мусора. Ок, только причём здесь плюсы?

Gvidon ★★★★
()

GC не очень вписывается в концепцию плюсов просто по определению. Тут либо городить жуткую абстракцию вокруг указателей (и не факт, что прирост в скорости будет), либо вообще не влезать в это. И чем больше работаю на плюсах, тем больше следую именно второму пункту.

kachsheev ★★★
()
Последнее исправление: kachsheev (всего исправлений: 1)
Ответ на: комментарий от Gvidon

Если тебе не только нравится жаба, но ты еще и хочешь писать для нее дополнения, ты быстро обнаружишь неприятную вещь: жаба написана не на жабе, а на c++. С этого момента пукан начинает рваться нонстопом

stevejobs ★★★★☆
() автор топика

жопс, хватит маяться демагогией, C++ тебе не подходит, забудь про него

C++ это его библиотеки в том числе, а в них не будет GC, будет странный микс

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от stevejobs

упреждаю мысль многих: используя классы Qt и других подобных библиотек, удается работать без прямой ручной работы с памятью, деструкторы и COW работает как нечто такое, что делает GC не нужным, ведь всё и так само чистится когда память не нужна

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от stevejobs

С этого момента пукан начинает рваться нонстопом

Ну так наймите кого-нибудь, у кого пукан покрепче.

eao197 ★★★★★
()

И всё равно не понял.
Приведи хоть один практический кейс, когда нужен GC?

P. S. Потому и не пишут, что оно не нужно.

Kroz ★★★★★
()

Использую подход - «не мусорить».

andreyu ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

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

погляди на что у тебя уходит память: скорей всего там 80% строк, которые можно и нужно уплотнять в долгоживущий пул строк. Например если это поисковый движок - то пользователи постоянно вводят в строку поиска одинаковые запросы, их нужно пулировать. ОСОБЕННО учитывая, какое говно в C++ строки. Но если ты каждый раз будешь пулировать определенные типы, то таким образом получится не generic код, где ты каждый раз обрабатываешь разные типы вручную - а это goвнго, код должен быть суперобобщенным

Потом начнутся циклические ссылки, дефрагментация памяти, отложенная и частичная дефрагментация, отладка блокировок, отладка блокировок для многопоточного случая, итд итп, и занимаясь бесконечными тоннами предварительной ручной оптимизации ты уже и забудешь, что изначально написать хотел :-)

stevejobs ★★★★☆
() автор топика
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от stevejobs

Ну и что на этой типичной задаче показывает Java с ее десятилетиями разрабатываемыми GC? Неужели не справляется и вы хотите использовать здесь C++?

eao197 ★★★★★
()
Ответ на: комментарий от eao197

первый же запрос на ютубе по поводу пула стрингов дает интересный доклад: https://www.youtube.com/watch?v=Q-7y1u9kZV0

Неужели не справляется и вы хотите использовать здесь C++?

С++ используется по основной причине: ЛЕГАСИ, разрабатываемое десятками лет. В моем случае, если бы компиляторы писались на Java, я был бы счастлив (именно поэтому и смотрю в сторону graalvm+truffle, позволяющее писать компиляторы на чистой Java). Но на самом деле, все пишут на C++ + LLVM, поэтому никуда от C++ не убежать.

stevejobs ★★★★☆
() автор топика
Последнее исправление: stevejobs (всего исправлений: 2)

C++/CLI смотрел?

dave ★★★★★
()
Ответ на: комментарий от stevejobs

для столь специфичной критичной задачи делается велосипед со своим менеджером таких данных в памяти, тупо один шмат памяти однажды выделенной и в ней всё это копошится

а может есть готовая библиотека для такой задачи, GC тут явно не нужен

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от stevejobs

Вы уж определитесь зачем вам C++: для высокочастотного трейдинга или для использования LLVM? Если для последнего, то с какого хера вы в пример приводите задачи трейдинга?

eao197 ★★★★★
()

Подскажите что-нибудь?

Если не вкуриваешь RAII, лучше обходи C++ стороной. Настрой Яву, как тебе надо, и работай, там куча ручек для управления GC. Что, не получается добиться <чего тебе надо> с явой? Се ля ви.

Deleted
()
Ответ на: комментарий от stevejobs

Причём здесь мусоросборник если тут явно вопрос алгоритма и дизайна.

invy ★★★★★
()

Подскажите что-нибудь? Шпасибо!

Выкинуть жабу из головы. Осилить raii. Осилить shared/unique_ptr.

invy ★★★★★
()
Ответ на: комментарий от invy

Выкинуть жабу из головы. Осилить raii. Осилить shared/unique_ptr.

Плохой совет. Очень плохой совет.
Лучше ведь так: «Выкинуть плюсы из головы». Не согласен?

MimisGotAPlan
()

Чисто не там где убирают, а там где не мусорят. Программисты C++ всякими GC не упарываются.

erfea ★★★★★
()
Ответ на: комментарий от invy

выше же писал, что голый без фантазии raii тормозит, а для разжигания фантазии и прошу дать какую-нибудь GC-подобную библиотеку

вот I-Love-Microsoft говорит:

а может есть готовая библиотека для такой задачи, GC тут явно не нужен

ну понятно, настоящий GC в Кресты и не впилить никак, нужна именно GC-подобная библиотека

stevejobs ★★★★☆
() автор топика

Пиши дополнения на дишечке, там есть гц, и отключаемый к тому же.

Hertz ★★★★★
()
Ответ на: комментарий от stevejobs

выше же писал, что голый без фантазии raii тормозит

В каком именно сценарии RAII у вас тормозит? Замеры какие-то реальные есть?

eao197 ★★★★★
()
Ответ на: комментарий от stevejobs

дважды проверил год. 2017-й.

если так писать, то без сборки мусора — никуда.

хорошо хоть этот треш убрали:

-        oop *derived_loc = loc;
-        oop val = *base_loc;
anonymous
()
Ответ на: комментарий от stevejobs

Если что-то и тормозит, то только твой алгоритм и дизайн а не RAII.

invy ★★★★★
()

Бери Visual C++, там есть оператор gcnew

anonymous
()

По идее ведь, каждый человек, который упарывается по сборке мусора, должен делать таковой велосипед для Крестов

Дык, множества «упарывающихся по сборке мусора» и «упарывающихся по крестам» не особо пересекаются.

DarkEld3r ★★★★★
()

unique/shared_ptr достаточно в большинстве случаев. Тем более что уже даже в стандарте.

Dark_SavanT ★★★★★
()

А смысл брать С++ и делать сборщик мусора? По моему тут убивается идея С++. Почему тогда не взять язык со сборщиком мусора?

kachan ★★
()
Ответ на: комментарий от stevejobs

Все правильно - javac на java, javac компилирует java в байтгод, а вот VM на который исполняется байткод уже написан на cpp.

anonymous
()

У большинства плюсоводов здесь в гойловах засела религиозная догма о том, что GC не нужен, потому что не труЪ. Это так мило!

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

У большинства плюсоводов здесь в гойловах засела религиозная догма о том, что GC не нужен, потому что не труЪ. Это так мило!

Ну вот надобность GC именно в C++ надо бы еще доказать. Ибо есть куча языков с GC, которыми можно пользоваться для самых разнообразных задач. Но вот приходить в C++ и просить GC для C++... Ну странно это, по меньшей мере.

eao197 ★★★★★
()

Зачем gc-хипстоте в плюсы? МС же сделала для вас C#

CatsCantFly
()
Последнее исправление: CatsCantFly (всего исправлений: 1)
Ответ на: комментарий от eao197

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

Может у товарища жирная кодовая база, и его запарила фрагментация памяти, готовые аллокаторы не подходят, а что-то своё запиливать не хватает ресурсов.

P.S. Я имел ввиду некоего абстрактного товарища, а не Стиви. Стиви — идиот, и это всем вроде как давно известно.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Ну, если бы это не был Стиви «истеричка» Джобс, об этом можно было бы подумать. Но тут явно не тот случай.

ЗЫ. А как воображаемый GC для плюсов может помочь с фрагментацией памяти? Ну в принципе? Перемещающий GC для плюсов вряд ли возможен.

eao197 ★★★★★
()
Ответ на: комментарий от hateyoufeel

Может у товарища жирная кодовая база, и его запарила фрагментация памяти

То есть наговнякал недумая? Кому такая кодовая база нужна?

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от invy

То есть наговнякал недумая? Кому такая кодовая база нужна?

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

eao197 ★★★★★
()
Ответ на: комментарий от stevejobs

Если тебе не только нравится жаба, но ты еще и хочешь писать для нее дополнения, ты быстро обнаружишь неприятную вещь: жаба написана не на жабе, а на c++. С этого момента пукан начинает рваться нонстопом

Ну так используй GC JVM, раз ты её расширяешь, в чем проблема?

asaw ★★★★★
()
Ответ на: комментарий от eao197

А как воображаемый GC для плюсов может помочь с фрагментацией памяти? Ну в принципе? Перемещающий GC для плюсов вряд ли возможен.

Не ну можно запилить что-то подобное. Только это будет уже не GC, а какой-то object manager.

invy ★★★★★
()
Ответ на: комментарий от stevejobs

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

peregrine ★★★★★
()
Ответ на: комментарий от hateyoufeel

GC в плюсах работает до тех пор, пока нет внешних либ.

RazrFalcon ★★★★★
()

В чужой монастырь со своим уставом не ходят.

То тебе рефлексия нужна, то сборщик мусора, может тебе всетаки не нужен C++?

pftBest ★★★★
()
Ответ на: комментарий от eao197

Перемещающий GC для плюсов вряд ли возможен.

Его можно запилить по типу того, как сделаны стандартные shared_ptr/weak_ptr, т.е. через кучу указателей. Будет чуток тормозить, но не больше, чем фрагментация.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

но не больше, чем фрагментация

с разморозкой. все живые ос на слабы переехали лет 10 как.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.