Здравствуйте, jazzer, Вы писали:
NBN>>Я писал проект работающий под 6 операционками, начиная от десктопа и заканчивая холодильниками и кондиционерами. NBN>>Сейчас проект попроще — только 3 разные операционки (их вариации и различные платформы не в счёт)
J>Тогда я не понимаю, о чем ты споришь — в твоем коде тоже будут и голые указатели, и указатели на void (а то и что похуже, типа LPARAM).
Где-то внутри — они есть. Только в 99% случаев я их не вижу.
То что кто-то пишет что-то наподобии:
return ((int (*)(int, int))0x12345678)(1, 1);
не означает что я тоже должен так писать.
J>В первой ссылке написано, что есть такой классный GC для С++, что если не дышать и не топать громко, то он работает примерно так, как должен работать GC в нормальном управляемом языке. J>А это означает, что GC в том смысле, в котором он рулит в управляемых языках, в С++ нет.
Ага, смартпоинтеров тоже нет. Если их используешь — тоже топать низя. И наследования тоже нет — ану как забудешь виртуальный деструктор? Вобщем ничего нет, одна адресная арифметика.
Здравствуйте, dip_2000, Вы писали:
NBN>>Фиговое оправдание. void* имеет ограниченное применение только при разработки либ наподобии STL. Вне этого — повод для увольнения. _> А различного рода API(начиная с Win API) уже отменили что ли ?
А в какое API ты отдаёшь буфер во владение?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
J>Если тебе не приходилось иметь дела с другими системами, имеющими странные интерфейсы, в том числе написанными на голом С, то ты совсем не много раз спускался. В принципе, можно позавидовать, так как удовольствие то еще.
А что, из явы с этими интерфейссам можно работать?..
Как-то не понятно, почему то, что из С++ легко позвать неуправляемый код, выдаёшь за то, что нет GC...
Логика какя-то странная...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
J>Строго говоря GC в С++ есть, только реально никому не нужен, поэтому традиционно не используется.
J>Твои слова?
Тут нет ни слова про поддержку. Поддержка будет в следующем стандарте.
Это из разряда — в С можно писать в ООП стиле, включая использование виртуальных функций, но вот поддежки ООП в языке нет.
J>Особенно интересно в свете развернувшейся дискуссии, что ты вкладываешь в слово "строго" выше?
Строго — значит оно есть. А выделил это слово чтобы показать что есть нюансы использования. Классический пример — если будешь хранить указатели в разобранном виде или выделять память нестандартным образом — ничего не будет работать.
NBN>>Ну и что? Я могу привести пару дурацких примеров наподобии твоего — доказывающих, что нет смартпоинтеров. NBN>>Но они есть J>Да, они есть, а GC нет. J>Потому что GC — это "создал и забыл", с гарантией, что никогда не получишь указателей в никуда или в мертвый объект.
Ну я примерно так и писал в тестовом проекте. Выделял-выделял-выделял память и не заботился о её удалении и всё работает зашибись. Единственное что я когда пишу — понимаю, что происходит и соблюдаю условия необходимые для работы gc.
J>А GC в стиле "создал и не дай бог забудешь, где и что и как с ним обращаться" — такой GC действительно никому не нужен, разве что в качестве back-end управляемой среды.
C++ у нас феррари
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, dip_2000, Вы писали:
NBN>>>Фиговое оправдание. void* имеет ограниченное применение только при разработки либ наподобии STL. Вне этого — повод для увольнения. _>> А различного рода API(начиная с Win API) уже отменили что ли ? E>А в какое API ты отдаёшь буфер во владение?
в исходном примере от jazzer'a была немного другая история. мы скорее получали владение. А таких историй масса
Здравствуйте, Roman Odaisky, Вы писали:
J>>А это означает, что GC в том смысле, в котором он рулит в управляемых языках, в С++ нет.
RO>И не может быть.
Хоть 10 раз можно повторить, это бесполезно пока есть конкретные работающие примеры.
J>А GC в стиле "создал и не дай бог забудешь, где и что и как с ним обращаться" — такой GC действительно никому не нужен, разве что в качестве back-end управляемой среды.
Например, ты можешь завернуть управляемый указаетль в умный, который просто не даст тебе сделать из него неуправляемый неявно...
В целом я так тебя понял, что ты считаешь, что в C++ нет GC? так как можно получить неуправляемый указатель и он останется после разрушения нашего объекта. Так в С++ много чего можно. Если тебе не нужны неуправляемые указатели, то просо не пользуйся ими
Или ты боишься, что скажется неуправляемость аргументов в функции типа strstr? Так старый С-шный код вроде как GC никак не зовёт...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, dip_2000, Вы писали:
E>>А в какое API ты отдаёшь буфер во владение? _>в исходном примере от jazzer'a была немного другая история. мы скорее получали владение. А таких историй масса
Пример jazzer'a никакого отношения к gc не имеет.
Здравствуйте, NikeByNike, Вы писали:
J>>>А это означает, что GC в том смысле, в котором он рулит в управляемых языках, в С++ нет.
RO>>И не может быть.
NBN>Хоть 10 раз можно повторить, это бесполезно пока есть конкретные работающие примеры.
Пока эти примеры похожи на исключения, только подтверждающие общие правила.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
NBN>>Хоть 10 раз можно повторить, это бесполезно пока есть конкретные работающие примеры.
E>Пока эти примеры похожи на исключения, только подтверждающие общие правила.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, dip_2000, Вы писали:
E>>>А в какое API ты отдаёшь буфер во владение? _>>в исходном примере от jazzer'a была немного другая история. мы скорее получали владение. А таких историй масса NBN>Пример jazzer'a никакого отношения к gc не имеет.
Имхо, мой пример как раз в нему отношение и имеет, потому что этот код в системах с GC будет работать без запинки.
И можно будет говорить о том, что в С++ есть GC, только тогда, когда код на С++ с использованием GC будет таким же прозрачным.
NBN>Пример с gc выглядит так:
NBN>
Здравствуйте, NikeByNike, Вы писали:
NBN>Пример jazzer'a никакого отношения к gc не имеет.
Слушайте, уважаемый... я щас несколько раз перечитал исходный пост jazzer'a, там несколько раз русским по белому упоминается GC. Но это еще пол беды, началось все с вашей фразы
Строго говоря GC в С++ есть
которую на протяжении всей дисскуссии вас просят прояснить, а прояснения не наступает
Это конечно безумно интересная дисскуссия, но я не готов в ней учавствовать со скоростью 2 поста в минуту Особенно когда посты как минимум на первый взгляд(а для меня и на второй), выглядят противоречащими один другому
Извиняюсь, что вмешался
Посмотрим на сколько у jazzer'a хватит терпения
Здравствуйте, NikeByNike, Вы писали:
NBN>>>Хоть 10 раз можно повторить, это бесполезно пока есть конкретные работающие примеры.
E>>Пока эти примеры похожи на исключения, только подтверждающие общие правила.
NBN>Ты о чём?
О том, что приведенные в качестве примера разработанные тобой программы, работающие на С++ c GC, не являются достаточным опровержением тезиса о том, что в C++ нет GC. Это всего лишь демонстрация того, что на C++ можно написать так, что какой-то GC будет работать. В общем, как секс ежиков -- очень и очень осторожный.
Но в общем случае для C++ GC до сих пор нет.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, jazzer, Вы писали:
J>Имхо, мой пример как раз в нему отношение и имеет, потому что этот код в системах с GC будет работать без запинки.
Ойли, ты можешь получить gc-указатель на объект созанный на стеке?
J>И можно будет говорить о том, что в С++ есть GC, только тогда, когда код на С++ с использованием GC будет таким же прозрачным.
Я не вижу никакого смысла отменять возможность выделения памяти на стеке под временные объекты.
Здравствуйте, jazzer, Вы писали:
J>>>1. Отсутствие GC. На С++ крайне сложно писать прототипы и вообще заниматься "быстрой разработкой", просто потому что в С++ ресурсами приходится управлять вручную, в отличие от управляемых языков, в которых все объекты, будучи однажды созданными, живут вечно.
NBN>>Строго говоря GC в С++ есть, только реально никому не нужен, поэтому традиционно не используется.
J>"Строго говоря" — это в стандарте, что ли? J>Где он есть? Он умеет разруливать касты к голым указателям и обратно? А указатели внутрь структур? (то же самое относится и к умным указателям, кстати)
Для С++ есть ряд GC с разными характеристиками. Причём есть ряд GC так сказать промышленного уровня.
Первое, что надо упомянуть, это естественно Boehm GC: http://www.hpl.hp.com/personal/Hans_Boehm/gc/
Platforms
The collector is not completely portable, but the distribution includes ports to most standard PC and UNIX/Linux platforms. The collector should work on Linux, *BSD, recent Windows versions, MacOS X, HP/UX, Solaris, Tru64, Irix and a few other operating systems. Some ports are more polished than others. There are instructions for porting the collector to a new platform.
Current users:
Known current users of some variant of this collector include:
The runtime system for GCJ, the static GNU java compiler.
W3m, a text-based web browser.
Some versions of the Xerox DocuPrint printer software.
The Mozilla project, as leak detector.
The Mono project, an open source implementation of the .NET development framework.
The DotGNU Portable.NET project, another open source .NET implementation.
The Irssi IRC client.
The Berkeley Titanium project.
The NAGWare f90 Fortran 90 compiler.
Elwood Corporation's Eclipse Common Lisp system, C library, and translator.
The Bigloo Scheme and Camloo ML compilers written by Manuel Serrano and others.
Brent Benson's libscheme.
The MzScheme scheme implementation.
The University of Washington Cecil Implementation.
The Berkeley Sather implementation.
The Berkeley Harmonia Project.
The Toba Java Virtual Machine to C translator.
The Gwydion Dylan compiler.
The GNU Objective C runtime.
Macaulay 2, a system to support research in algebraic geometry and commutative algebra.
The Vesta configuration management system.
Visual Prolog 6.
Asymptote LaTeX-compatible vector graphics language.
GC консервативный, т.е. никакая дополнительная мета-информация ему не нужна, но зато он считает указателем всё, что похоже на указатель. Т.е. "void*" он будет обрабатывать корректно.
Далее есть HnxGC: http://hnxgc.harnixworld.com/
Он точный, т.е. ему нужна мета-информация относительно расположения указателей в объектах. Соотв. управляет он только объектами отнаследованными от спец. класса. Плюс использует умные указатели и подсчёт ссылок. Т.е. не-циклический мусор удаляется синхронно. А циклический во время запуска сборки мусора, которая соотв. проходит очень редко. Если нет циклического мусора, то видимо сборку можно вообще не запускать, но на всякий случай она всё равно "будет там".
SGCL http://sourceforge.net/projects/sgcl/
Его не смотрел, но в описании написано "Precise, concurrent Garbage Collection library for C++.", т.е. видимо тоже использует мета-информацию. Плюс parallel и concurrent.
Не пользуются ими C++ программисты видимо просто из "исторических" причин. Типа мы же 20 обходились без GC, а теперь Вы нам пытаетесь сказать, что без него нельзя писать работающие программы и жить вообще
Хотя можно и писать на C++, и использовтаь GC одновременно — достаточно поглядеть на список пользователей Boehm GC.
Здравствуйте, dip_2000, Вы писали:
_>Слушайте, уважаемый... я щас несколько раз перечитал исходный пост jazzer'a, там несколько раз русским по белому упоминается GC. Но это еще пол беды, началось все с вашей фразы _>
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, jazzer, Вы писали:
J>>Имхо, мой пример как раз в нему отношение и имеет, потому что этот код в системах с GC будет работать без запинки. NBN>Ойли, ты можешь получить gc-указатель на объект созанный на стеке?
Я же сказал, расставь __gc по вкусу.
Естественно, подразумевается, что s создан управляемым.
Прошу прощения, если запутал тебя.
J>>И можно будет говорить о том, что в С++ есть GC, только тогда, когда код на С++ с использованием GC будет таким же прозрачным. NBN>Я не вижу никакого смысла отменять возможность выделения памяти на стеке под временные объекты.
По этому поводу никто с тобой и не спорит, вроде.
Здравствуйте, eao197, Вы писали:
NBN>>Ты о чём?
E>О том, что приведенные в качестве примера разработанные тобой программы, работающие на С++ c GC
Где я приводил такой пример???
E>не являются достаточным опровержением тезиса о том, что в C++ нет GC.
Ага, если код есть и работает, это не является доказательством его наличия?
E>Это всего лишь демонстрация того, что на C++ можно написать так, что какой-то GC будет работать.
А этого не достаточно, для того чтобы признать, что на С++ можно писать используя gc?
E>В общем, как секс ежиков -- очень и очень осторожный.
Спорно.
E>Но в общем случае для C++ GC до сих пор нет.
Как раз в общем он есть. Просто не используется по нескольким причинам (скорость, нераспространённость, отсуствие поддержки со стороны стандартных либ).
Здравствуйте, jazzer, Вы писали:
NBN>>Ойли, ты можешь получить gc-указатель на объект созанный на стеке? J>Я же сказал, расставь __gc по вкусу.
А это что?
J>Естественно, подразумевается, что s создан управляемым. J>Прошу прощения, если запутал тебя.
Если я правильно понял, то всё будет выглядеть так:
struct S
{
int* i;
S()
{
i = gcnew int(1);
}
};
int* f()
{
S s;
return s.i;
}
int main()
{
int* pi = f();
}