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)
Ответ на: комментарий от eao197

кресты сделали полный круг, и переизобрели * в виде std::experimental::observer_ptr =) Просто не юзай звездочку, юзай то что больше подходит по ситуации

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

У меня есть ощущение, что либо из-за незнания C++, либо из-за Java головного мозга, вы не понимаете, что такое observer_ptr и для чего он нужен.

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

Ничоси! А я так всегда в прошивках и демонах пишу. А оно воно как!

Ну и быдло. Корректное завершение должно быть предусмотрено:

while(!exit_requested) {
   /* Твой говнокод */
}

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

Какое корректное завершение у прошивки? Чтобы кирпич сделать?
Какое корректное завершение у демона, который должен работать вечно на серваке со средним аптаймом 200+ дней?

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

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

из джавы есть похожий пример: можно использовать synchronized блоки для многопоточности (это неуправляемое ключевое слово, прямо как звездочка), а можно использовать ReentrantLock который является управляемым объектом

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

Какое корректное завершение у прошивки? Чтобы кирпич сделать?

корректное выключение устройства

Какое корректное завершение у демона, который должен работать вечно на серваке со средним аптаймом 200+ дней?

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

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

из джавы есть похожий пример: можно использовать synchronized блоки для многопоточности (это неуправляемое ключевое слово, прямо как звездочка), а можно использовать ReentrantLock который является управляемым объектом

java говно, пиши на ruby, ешь овсянку

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

корректное выключение устройства

Возьмет и «корректно выключится» у тебя датчик газа на кухне. Или сраный микрофон на РБМК. И всё.

К слову о датчиках газа на кухне - ребутится с противным писком раз в 48 часов. Хз что с ним делать.

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

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

Нда-с... Клиника.

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

Возьмет и «корректно выключится» у тебя датчик газа на кухне. Или сраный микрофон на РБМК. И всё.

конечно ох#енно будет, если он выключится некорректно

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

видел много раз, как люди выходят из while(1) - в соседнем треде делают System.exit(0) по условию

еще можно из соседнего приложения выйти при помощи kill, а также из коридора, выключив автомат в щите

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

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

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

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

корректно перезапустить уже не могут, т.к. ты м#дак и написал while(1)

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

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

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

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

тоесть ты решил что раз на говнодатчике так прокатило, то и на остальных устройствах прокатит? иди школьниками домашку на паскале делай, хацкер

anonymous
()
Ответ на: комментарий от shty

вы просто очень боитесь, что кто-то всё-таки такое запилит, все начнут писать на крестах с ГЦ, и все годами наработанные пляски с бубнами вокруг raii перестанут быть невероятно оплачиваемыми =)

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

Стиви, Уотер Брайт (далеко не последний человек в области разработки C++компиляторов), такое уже запилил. Язык D называется. Чой-то все не начали.

Вы подумайте, это ж не спроста.

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

Ну конечно же не начали, потому что это другой язык, а людей по вакансиям набирают на вполне конкретный язык - C++. Да и кодовая база с историей 20+ лет сама по себе с C++ на D не перепишется. Вот если бы это был тот же самый С++ только с приблудой - совершенно другая история.

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

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

Вся соль срачей жаба vs с/с++.

crutch_master ★★★★★
()

GC не нужен. Если кажется, что он нужен, значит проект переусложнен, его надо разбить на микросервисы и обмазаться *mq.

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

Вот если бы это был тот же самый С++ только с приблудой - совершенно другая история.

Ничего подобного. Когда C++никам был нужен GC, они просто переходили на другой язык. Кто на Java, кто на C#, кто на Go и т.д. В итоге C++ остался там, где GC создает больше проблем, чем решает.

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

вы просто очень боитесь, что кто-то всё-таки такое запилит, все начнут писать на крестах с ГЦ

я открою одну страшную тайну - всем насрать, и даже если вдруг (!) сделают убер-язык (утопия, но пусть), пресловутые «все» на него молча переползут и продолжат дальше писать мощные фабрики распределенных микросервисов с развитым искусственным интеллектом для показа котиков пользователям социальных сетей

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

и все годами наработанные пляски с бубнами вокруг raii перестанут быть невероятно оплачиваемыми =)

Не перестанут. Потому что RAII позволяет не только почистить память, но ещё и корректно завершить соединение, закрыв после этого сокет, удалить файл, сохранить настройки и т.п. Очень много разных полезных вещей становится делать легко, когда время жизни объекта строго определено, чего нельзя сказать о Java.

asaw ★★★★★
()

человек, который упарывается по сборке мусора

C++

Но зачем? Если ты не осилил грамотное владение объектами и вообще проектирование классов - пиши на Java/C#. Плюсы всё же для осиляторов. А если осилил, то написание delete, там, где оно нужно (а нужно оно далеко не всегда), проблем не представляет.

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

ты будешь удивлён, но в джаве тоже возможно писать в raii паттерне. На то он и паттерн, чтобы эмулироваться на любом Си-подобном языке :) Просто люди не заморачиваются.

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

не использовать фичи джавы, нахреначить фреймворк с кастомным лайфсайклом - дело только больного воображения и пары вечером под веществами :) Метапрограммирование на аннотациях, XML, именах классов и методов есть? Класслоадеры есть? Джава-агенты? ASM, манипуляции с байткодом, дебаг-информация?Вперед и с песней ;) Вон чуваки в именах методов хранят SQL (привет Spring Data), а тут какой-та raii, тоже проблема

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

нахреначить фреймворк с кастомным лайфсайклом

С этого места поподробнее, пожалуйста. RAII в C++/D/Rust/Go держится на гарантированном и детерминированном вызове деструкторов (defer для Go) при выходе из скоупа. Как вы это собираетесь обеспечить в Java?

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

Очень просто: сейчас все приложения используют Spring. Мы просто добавляем делаем метод контейнера delete и вызываем его на всех @Autowired переменных, когда в цепочке закончится последний под-метод проаннатированный как @UnmanagedResources (аннотация будет работать аналогично @Transactional, скоуп ресурсу допустим можно будет указывать опцией - закрываться сразу после первого же @UnmanagedResources-метода или после последнего метода в цепочке)

У него уже есть вполне детерминированный «тройной конструктор» (1 - конструктор класса в Java, 2 - init-method в XML, 3 - аннотация @PostConstruct в Java). Он уже может удалять бины со скопом singleton с помощью DefaultListableBeanFactory.destroySingleton и .removeBeanDefinition (и создавать их назад через .registerSingleton). @PreDestroy срабатывает детерминированно в момент исключения бина из контейнера.

Вопрос, что делать с бинами со скопом prototype (аналогом обычных переменных) - либо сделать для них кастомную обработку @PreDestroy, либо симулировать «особые прототипы» поверх синглтонов с автогенерящимися именами (но тогда придется подшаманить в @Autowired чтобы оно связывало не только непосредственно по имени, но и искало имя+автогенернный_префикс, либо в виртуальной таблице переменных).

При этом и @PostConstruct, и @PreDestroy - это часть стандарта JSR-250, поэтому метафора понятна примерно всем.

Короче, проблем нет никаких. Но и смысла тоже не видно никакого :)

Вероятно поэтому создатели Spring и не стали прорабатывать метафору лайфсайкла до конца, и ограничились только той её частью где ресурсы получаются. Если кто-то сильно захочет их освободить - ну что ж, он найдет способ как сделать это, и не используя автоматики

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

Очень просто: сейчас все приложения используют Spring.

Если для того, чтобы файл автоматически закрылся при выходе из скоупа, нужно притягивать Spring и оформлять класс для работы с файлом в виде бина, то это будет использоваться только такими же альтернативно одаренными, как вы, Стиви. Уж простите мне мой французский.

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

нужно притягивать Spring

Spring не «нужно» притягивать, я не видел за последние много лет ни одного приложения (включая хэлловорлды на несколько строчек), где бы Spring не добавлялся первым коммитом. Можешь считать что Spring теперь - это часть языка Java :)

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

я не видел за последние много лет ни одного приложения (включая хэлловорлды на несколько строчек), где бы Spring не добавлялся первым коммитом

показать?

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

А можно на сях писать в ооп стиле и накостылить сборку мусора. Давайте все писать на сях!

Язык нужно выбирать под задачу.

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

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

Простите, а вы кто? Господь Бог, чтобы видеть все?

Детский сад какой-то.

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

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

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

Очень просто...

«Решение», конечно, монструозное, но мне интересно оно правда будет работать во всяких хитрых случаях? Прелесть RAII на деструкторах в том, что оно будет работать и для вложенных классов, причём пользователю не нужно ничего знать, если где-то в глубине появится ресурс.

Короче, проблем нет никаких. Но и смысла тоже не видно никакого :)

Похоже прямо как с вопросом про GC в C++.

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

Похоже прямо как с вопросом про GC в C++

Ага, то же самое, только с поправкой что проблемы с этим есть, и смысл тоже.

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