CyRax, я вот впервые в жизни взял почитать Рихтера, дабы подкрепить свои практические знания, теорией И вот что пишет умный чел. по этому поводу (по поводу загрузки нескольких копий одной и той же DLL)
-------------------------
Экономия памяти. Если одну и ту же DLL использует несколько приложений, в оперативной памяти может храниться только один ее экземпляр, доступный этим приложениям. Пример — DLL-версия библиотеки С/С++. Ею пользуются многие приложения. Если всех их скомпоновать со статически подключаемой версией этой библиотеки, то код таких функций, как sprintf, strcpy, malloc и др., будет многократно дублироваться в памяти. Но если они компонуются с DLL-версией библиотеки С/С++, в памяти будет присутствовать лишь одна копия кода этих функций, что позволит гораздо эффективнее использовать оперативную память.
------------
Может я, что-то не верно понял, но...
Павел, и все-же не может юыть чтобы код виртуальной машины вызывался быстрее чем машинный. Ну не может такого быть... Там попросту ступеней обработки, как минимум, раза в три больше...
А вот то что мужик поспорил... Тоже маловероятно... Код Си, натболее чистый, в плане бесполезных вызовов и манипуляций со стеком, И работает он пусть в несколько десятков раз медленней сем ассемблерный, но это терпимо...
FW же нужно загрузить, передать ему данные, он сделает вычисления (при том что сам-то FW наверняка использует машинный код, иначе как бы его понимал х86 наш...) и отдать все это дело обратно приложению... На все это тратятся тики процессора десятками тысяч...
Единственное оправдание, это то что CPP отвратительно работает с числами (уж какими, я там не знаю, но вероятно float... но это очень маловероятно...)
Ну а с ассемблером-то конечно же ни один высокоуровневый язык сравнивать не стоит...
Таксь... О .Net с дилетантами больше не разговариваю..
А с sne поговорить все же приятно
Я все же не думаю, что операции выполняет FW.... Судя по информации из
многих источников, IL-код компилируется в машинный код при первом
запуске программы и затем спокойно исполняется... CLR служит лишь так
сказать, надзирателем над действиями кода...
Кстати, Sharp вроде обещал разобраться в принципе функционировании
.NET летом.. Лето уже проходит, а Sharp'а не слыхать
Ну я же говорю, что человек просто не врубается в суть...
бОльшая часть .Net FW - это библиотека классов .NET, которая
предоставляет разработчикам удобные средства для работы со всем на
свете: WinForms, графика, файловая система, сеть, веб, XML,
криптография, БД и иже с ними.
Опять же добавлю, что все эти возможности можно реализовать и без
библиотеки классов (используя только необходимый минимум) с
использованием неуправляемого кода: Win32API и COM.
А остальное - компиляторы (vbc, csc и т.д.), JIT-compiler, CLR,
JIT-дебаггер, некоторые прикладные средства для управления .Net FW, в
частности для работы с GAC, проверки и создания ЦП сборок, управления
безопасностью FW, ядро ASP .NET и др.
Павел, думаешь !?
Т.е. это уж получается совсем гибрил какой-то ))
Тут же и машинных код, тут же и команды для FW'ка...
Хотя мне все-равно с трудом верится, даже если генерируется машинный код, что он настолько "чист", что превосходит нынешний VC...
При статической ликовке, все за тебя делает компилятор... Тебе остается только брать готовенькое и использовать...
DllEntry/LibMain вызывается при загрузке программы.
При динамической линковке, ты в состоянии сам загрузить/выгрузить библиотеку из памяти... Благо так устроены плагины...
DllEntry/LibMain вызывается при подключении DLL к процессу.
И в том и другом случае DllEntry/LibMain вызывается в то время, как ее копия будет спроектирована в адресное пространство процесса...
Я не претендую на верность этого мнения, т.к. я ничего не читал по этолй теме, и исхожу чисто из своих наблюдений и своего понимания...
--------
Ну и в догонку. С чего это ты взял что
>CPP отвратительно работает с числами (уж какими, я там не знаю, но вероятно float...
Как ты проверял?
--------
Нет, это всего-лишь предположение как может программа на C# выиграть по скорости у машинного кода VC... Я же сам сказал, что это маловероятно!
Разумеется я этого не проверял, на то оно и предположение
> А вот мне честно говоря не верится что 60 МБ .NET FW все ушли на рантаймовую проверку за действиями исполняемого кода.
А по-моему нехилая часть ушла на ЭУ, еще на классы, на обработку ошибок... Возможно, конечно же, что и на самом деле в математике там используется машинный код... Хотя это в действительности лишь предположение...
Опять же добавлю, что все эти возможности можно реализовать и без
библиотеки классов (используя только необходимый минимум) с
использованием неуправляемого кода: Win32API и COM.
Угу, минимум и при этом все же требуется РанТайм
Если MS сделали фишку как в Дельфи/Borland CPP, это отключение рантайма (там это VCL), я бы очень активно использовал бы новенький VB... и писал бы все на АПИ, ну дак нет же, упертые MS, перекрыли все пути к отступлению, да еще и не доделали конвертор из VB в .NET...
sne,
Я не спрашивал что нужно делать при статической и динамической линковках. Я спрашивал что происходит в результате.
Так я тебе объясню. При статической линковке линкер сшивает вместе все библиотеки в один файл.
При динамической происходит в принципе тоже самое, но только это делает уже не линковщик, поставляемый вместе с компилятором, а линковщик системы. Он сшивает все модули динамически в памяти, а не в одном файле как при статической линковке. Это замедляет скорость запуска программы, но уменьшает размер исполняемого файла или библиотеки.
Программа, написанная к примеру на VB6, в памяти занимает вовсе не размер экзешника, а MSVBVM60.DLL плюс экзешник. И так для каждой копии программы. Если бы не было динамической линковки, то каждая программа на VB6 занимала бы по 1.5 МБ на диске.
А так она занимает от 14 кБ. Но это не отменяет того что реальный размер её в памяти все равно будет включать размер виртуальной машины.
Тебе это тяжело понять потому что ты программировал исключительно под Win32. Я же прошёл весь этап от ДОС. Причём уже в то время, когда ДОС вышел из употребления. Не зря ведь ассемблерщики советуют начинать программировать под ДОС. Это вовсе не дань традиции, это помогает лучше понимать что реально происходит в системе.
sne,
Я не спрашивал что нужно делать при статической и динамической линковках. Я спрашивал что происходит в результате.
Так я тебе объясню. При статической линковке линкер сшивает вместе все библиотеки в один файл.
При динамической происходит в принципе тоже самое, но только это делает уже не линковщик, поставляемый вместе с компилятором, а линковщик системы. Он сшивает все модули динамически в памяти, а не в одном файле как при статической линковке. Это замедляет скорость запуска программы, но уменьшает размер исполняемого файла или библиотеки.
Программа, написанная к примеру на VB6, в памяти занимает вовсе не размер экзешника, а MSVBVM60.DLL плюс экзешник. И так для каждой копии программы. Если бы не было динамической линковки, то каждая программа на VB6 занимала бы по 1.5 МБ на диске.
А так она занимает от 14 кБ. Но это не отменяет того что реальный размер её в памяти все равно будет включать размер виртуальной машины.
Тебе это тяжело понять потому что ты программировал исключительно под Win32. Я же прошёл весь этап от ДОС. Причём уже в то время, когда ДОС вышел из употребления. Не зря ведь ассемблерщики советуют начинать программировать под ДОС. Это вовсе не дань традиции, это помогает лучше понимать что реально происходит в системе.
И что ты привязался к этой математике. Вся математика реализована через инструкции сопроцессора и одинакова для всех языков. В каком стиле написан сам компилятор в таком и "математика". Изобретать там ничего не надо.
2 Павел
Жму руку за долготерпение
2 CyRax
Не хотел бы я пригласить тебя в гости, думается мне ты бы бегал ошалело по моей квартире и орал диван это пошло нужно спать на лавке сделанной топором вручную, спать нужно на полу, а есть только геркулесовую кашу. Сухую
И вооьще незнакомыи людям замят и навязывают собственное мнение только подростки и люди с неслажившейся личной жизнью
SEE YA