#include «gc.h»
//Так мы определяем класс подлежащий собиранию
struct A : gc_managed_provider_t<A> {
//а так мы дополняем его метаинформацией о хранимых ссылках
A() : gc_managed_provider_t<A>(&A::a) {}
//Собственно хранимая ссылка
gc_ref_t<A> a;
};
int main(int argc, char *argv[])
{
{
//Строки в конструкторе - только для детального отображения
gc_ref_t<A> a1(«a1»);
gc_ref_t<A> a2(«a2»);
std::cerr << «\n =simple=\n» << std::endl;
gc_t::instance()->collect();
//Создаем кроссылочность
a1->a = a2;
a2->a = a1;
std::cerr << «\n =cross-reference=\n» << std::endl;
gc_t::instance()->collect();
}
std::cerr << «\n =after scope=\n» << std::endl;
gc_t::instance()->collect();
std::cerr <<«finish» << std::endl;
return 0;
}
Вывод(в предпросмотре спойлер [cut] не пашет чего-то):...
=simple=
GC[before]: 2 elements in pool
memblock [a1] has 1 references
memblock [a2] has 1 references
GC[after]: 2 elements in pool
=cross-reference=
GC[before]: 2 elements in pool
memblock [a1] has 2 references
memblock [a2] has 2 references
GC[after]: 2 elements in pool
=after scope=
GC[before]: 2 elements in pool
memblock [a1] has 1 references
** CIRCULAR removed **
memblock [a2] has 1 references
** CIRCULAR removed **
GC[after]: 0 elements in pool
finish
По крайней мере с приведенным примером кроссылочности справляется.
Сам код весьма примитивный(без перегрузок new) и его можно расширить нормальным алгоритмом обхода, variadic tempaltes и прочими штуками но и так работает.
По поводу затянувшейся 'беседы' хочу сказать что когда слышу 'GC такойже как в Java' то мне всё время вспоминается история про Неуловимого Джо и причины его неуловимости... А вообще emulek отличный тролль(добрый и терпеливый) и хорошо транслирует идею что счетчик ссылок тоже GC и для частного случая можно запилить GC который _работает_, а про 'такойже крутой с маджонгом и гейшами' я уже сказал.
Инструментарий(и язык и библиотеки) должен быть адекватен решаемой задаче.
В плюсах для менеджмента памяти есть sharet_ptr, weaked_ptr и прочие. Фрагментация и прочие прелести нагруженных систем тоже могут быть решены стандартным механизмом алокаторов памяти. За много лет работы на плюсах у меня ни разу не возникла потребность в GC.
Зачем для веба нужен вообще GC? Когда страница сформирована и ушла по TCP можно удалять вообще все объекты же. То есть перед началом работы пометить вершину кучи, а после завершения одним махом удалить все что выше пометки.
Ну там удобных средств работы с текстом в С++ нет. А без плюшек типа auto от С++11, так вообще кодинг на С++ становится крайне унылым занятием. Один std::vector<std::string>::iterator без рабочих комплишенов чего стоит. А комплишены в С++ в реальных условиях всегда нерабочие.
У нас в проекте на C/C++ написано OLAP приложение (сервер для тонкого клиента), с помощью axis. Для приложений, издавна написанных на С++, это проще, чем interop-ы всякие через другие языки. Сложность С++-сности веба там лишь толика сложности самого приложения.
А если выкинуь бесполезный и тормазной nginx, бесполезный и тормазной С++ и бесполезную и тормазную TimesTen DB, то получатся все 1600к, а если ещё выкинуть всё, что связанно с вебом, бд и селектом - ещё больше.
Зачем менять шило на мыло? Если ты решил отгазаться от бесполезного мейнстримного говна - дак выкидывай всё говно, а не строй кастыли для этого говна.
Я тебя удивлю, но нигде не нужен ГЦ. Ни в вебе ни в любой другой области. Одни опрадывают свою ущербность теорямиями о ГЦ, другие оправдывают свою ничтожность верой и юзом ГЦ.
Вот уже неделю ковыряю Wt - да это же почти клон Qt для Web, там всё родное привычное для кутэшника. Одно удовольствие писать что-то.
Да, может это не идеал для медленных коннектов, но для огромного числа задач, типа web-интерфейса и прочих нетребовательных задач - создать очень сложный функционал в браузере - легко и просто.
Никогда не изучал web-девелопмент, не знаю яваскрипт и с основном на C++ пейшу. Для меня Wt идеальный инструмент, надеюсь не разочаруюсь, ведь я только неделю его изучаю.