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

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

Как-то я себе слабо представляю. Ну вот есть у меня, скажем:

void foo(const std::string & s) {
  if(!s.empty()) {
    const char * p = s.data();
    ... // (1)
    if(*p == '0') {
      ...
    }
  }
}
В точке (1) запустился GC и память, которой владела s, переместилась. Соответственно, либо p начнет указывать куда-то не туда, либо же GC нужна помощь со стороны компилятора языка и run-time дабы обнаружить p и модифицировать его после перемещения содержимого s.

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

видимо, предполагается возврат какого-то collectible_ptr из string::data

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

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

Комитет пилит рефлексию, да и GC обсуждают. Может, им всетаки не нужен C++?

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

Комитет пилит рефлексию, да и GC обсуждают. Может, им всетаки не нужен C++?

C++ никому не нужен, его давно уже списали со счетов и портируют Qt на ruby

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

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

TL;DR GC в C++ возможен, но получается жопа-жопа в любом случае.

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

TL;DR GC в C++ возможен, но получается жопа-жопа в любом случае.

да в принципе в C++ жопа-жопа в любом случае. Поэтому критичные к производительности вещи давно переписаны на питоне и руби, а десктоп плавно мигрирует на javascript

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

GC в C++ возможен,

Дык, с этим я и не спорил, Boehm-Demers-Weiser тому живой пример. Речь шла именно о перемещающем (или как его там, на буржуинском, называют, compacting) GC.

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

Я бы сказал, что перемещающий GC вполне себе возможен, просто нужно помнить о том, что использование указателей напрямую возможно только в защищенных областях кода, наподобие того, как используется std::weak_ptr. То есть можно было бы для доступа к объекту использовать прокси-объекты, получаемые из умных указателей. Пока прокси-объект жив, гарантируется, что сам объект никуда не переедет. Как только прокси умер, GC может перемещать объект. Когда умирает умный указатель, пропадает ссылка и GC может проверять не нужно ли объект вообще почистить.

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

критичные к производительности
питон и руби

ok

питон и руби уже обточили до скоростей выше C++, еще немного и обойдут код на чистом асм(за счет предсказательной оптимизации, как в jvm), поэтому сервера крутятся на питоне и руби(например все redmine или django). Плюсовикам придется смириться и уйти на обочину истории.

anonymous
()

я так понимаю, опции «не генерить мусор» нет даже в теории.

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

питон и руби уже обточили до скоростей выше C++, еще немного и обойдут код на чистом асм

а я помню времена когда в новостях на ЛОРе жаба обгоняла С++ и даже выполняла до конца бесконечный цикл.

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

галоперидол закончился или ты наоборот уже чем-то простимулировался?

anonymous
()

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

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

а я помню времена когда в новостях на ЛОРе жаба обгоняла С++ и даже выполняла до конца бесконечный цикл.

бесконечный цикл не должен зависать, от этого зависают приложения. поэтому java более передовой язык. К тому же пока вы тут обсуждаете «получится или не получится GC в C++» в java, python и ruby он работает и хорошо работает.

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

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

ты дебил или прикидываешься? бесконечный цикл - это явная ошибка в программе, которая может быть исправлена при помощи GC

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

К тому же пока вы тут обсуждаете «получится или не получится GC в C++» в java, python и ruby он работает и хорошо работает.

Он работает настолько «хорошо», что существуют целые отдельные Камасутры о том, как иметь дело с его побочными эффектами, ставящими раком всю систему.

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

Он работает настолько «хорошо», что существуют целые отдельные Камасутры о том, как иметь дело с его побочными эффектами, ставящими раком всю систему.

достаточно просто уметь программировать, к тому же «побочные эффекты» уже неактуальны. ОЗУ дешевая, процессоры мощные - добро пожаловать в новый мир, динозавры

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

достаточно просто уметь программировать, к тому же «побочные эффекты» уже неактуальны.

Нет недостаточно. Нужно ещё знать про всякие Eden Space, Survivor Space, Tenured Generation, Permanent Generation (Metaspace), Code Cache, про то, что там живет, как и куда переезжает, а главное - когда мир всё равно останавливается, несмотря на все эти изыски.

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

когда мир всё равно останавливается, несмотря на все эти изыски.

купи апгрейд и забудь про эту ересь. Ее придумали когда пентиум 2 на сервере - это была круть крутецкая. ->современное<- железо не нуждается в оптимизации руками, так как быстрое само по себе. Посмотри на размер L1 кэша, он уже явно превышает размер регистров, а ты все про Eden Space.

Остатете от жизни, она быстрее вас, дедули

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

Остатете от жизни, она быстрее вас, дедули

Тебя просто ни одна приличная контора не возьмёт писать на жабе до тех пор, пока ты про все эти тонкости GC не расскажешь во всех подробностях на собеседовании, студент)

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

Тебя просто ни одна приличная контора не возьмёт писать на жабе до тех пор, пока ты про все эти тонкости GC не расскажешь во всех подробностях на собеседовании, студент)

меня уже взяли и я все это знаю, хоть я еще в 9м классе, обтекай

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

Посмотри на размер L1 кэша, он уже явно превышает размер регистров

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

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

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

что ты не понял? расскажи подробнее, я объясню тебе. Сегодня я в хорошем настроении

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

а что, есть повод тебе завидовать? а еще у тебя помоему сало уронили.

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

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

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

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

Тебе GIL не жмёт там?

про Garbage Collector(GC) весь тред вообщето

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

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

на крестах кстати всегда сегфолты, даже то что уже переписано на Qt в наследство от крестов падает с сегфолтом

anonymous
()

коллекторы типа G1 или Shenandoah
коллекторы типа Shenandoah
Shenandoah
двавайте завернем все объекты в forwarding-пойнтеры (brooks ptrs) и будем в фоне их коллектить
C++

Этот товарищ очень толсто траллирует. Слонопотамные GC требуются в средах, в которых несколько int'ов из потока нельзя распарсить не намусорив. И когда все и вся находится за столько слоев референсов, что от еще одного слоя - ни тепло ни холодно. В C++ же мы имеем tight код, в котором абсолютное большинство используемых объектов живет на стеке и в котором по референсу ходят, только тогда когда действительно требуется (shared_ptr и проч). Вообщем - нет задач.

В golang по-моему нашли золотую середину, когда наличие GC в языке освобождает от существенного количества головной боли, мусора при этом генерится мало, и несложный (по сравнению с жабными) GC работает быстро.

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

В C++ же мы имеем tight код, в котором абсолютное большинство используемых объектов живет на стеке

а ты где живешь? еще один подпольный сопротивленец прогрессу в C++. GC нужен. Точка. Тире. Семь.

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

в C++. GC нужен

Как еврею крайняя плоть.

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

но ты еще и хочешь писать для нее дополнения

Зачем?

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

В C++ для каждого класса можно указать аллокатор. И потом юзать RAII. Аллокация и освобождение будут вставлены компилятором в нужных местах. Но сам аллокатор может решать удалять их сейчас или нет. Аллокатор например будет видеть только куски памяти и тут уже напрашивается велосипедный SLAB или просто очередь свободных указателей на основе кольцевого массива. Если надо, то thread local чтобы некоторой ценой памяти избавить себя от блокировок. Гугли arena allocator. Только у меня есть сомнения что существующий аллокатор не делает похожие оптимизации если может, я тут не эксперт. Надо мерять.

Потом начнутся циклические ссылки

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

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

Есть Core Guidelines о том, как этого не делать.

Отлично, вот тебе первый пример камасутры.

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

в C++ уебищное и тормознутое управление памятью. для эффективного new надо пейсать свой велосипед и все равно получится говно, ибо фрагментация памяти неизбежна. тупоголовый ишак страус изобрел классы на голых сишных указателях. тупее не придумаешь. так что С++ сосет по любому. для быстрой обработки больших массивов он нах не нужен, для этого и C достаточно.

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

в C++ уебищное и тормознутое управление памятью.

согласен, Qt на ruby будет работать быстрее. Особенно если интерпретатор ruby переписать на ruby

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

Но ведь в жабе тоже нельзя кидать исключение в деструкторе, как быть теперь?

переписать все деструкторы на ruby

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

В Java другая ситуация - там нужно выполнять вообще любой код миллионов людей. А у тебя конкретный софт, конкретная проблема.

мой конкретный софт - это и есть Java =) Пока еще не Хотспот (не дорос), просто эксперименты

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

у некоторых и сегфолты неизбежны.

но пишешь ты почему-то в браузере, написанном на С++, вместо того, чтоб зайти на ЛОР с браузера на жабе или на руби или ... ах да. их же нету.

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

но пишешь ты почему-то в браузере, написанном на С++, вместо того, чтоб зайти на ЛОР с браузера на жабе или на руби или ... ах да. их же нету.

https://ru.wikipedia.org/wiki/UC_Browser

https://ru.wikipedia.org/wiki/HotJava

о-пля! ну что скажешь, неадеватный кот?

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

https://ru.wikipedia.org/wiki/UC_Browser

В англоязычной вики указан движок:

U3 engine (based on Webkit)

https://en.wikipedia.org/wiki/Webkit

Written in C++

Про горячую жабу в англоязычной вики написано такое:

Initial release March 24, 1997; 20 years ago[1][2] Last release Late 2004; 13 years ago v3.0

HotJava had somewhat limited functionality compared to other browsers of its time.

More critically, HotJava suffered from the inherent performance limitations of Java Virtual Machine implementations of the day (both in terms of processing speed and memory consumption) and hence was considerably sluggish.

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

Несмотря на общую теоретическую отстойность C++ именно как языка (а не как платформу разработки, которая хороша), C++ синтаксически всё еще бесконечно лучше всяческих Golang

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