Каково различие в управляемом и неуправляемом коде, памяти и размере?

После наблюдения и слушания много относительно управляемого и неуправляемого кода и знания единственной разницы - то, что управляемый о CLR, и неуправляемый за пределами CLR, это делает меня действительно любопытным знать это подробно. Что все это о, управляемый и неуправляемый код, память и размер?

То, как может кодировать, я пишу в C# быть неуправляемым, в то время как это - код C# и как делает память размера, становится неуправляемым. Пример и немного понимания были бы полезны.

69
задан Peter Mortensen 15 January 2013 в 23:46
поделиться

3 ответа

Краткий ответ:

  • Управляемый код - это код .NET (VB.NET, C # и т. Д.), Который вы пишете и компилируете в .NET CIL .
  • Неуправляемый код - это код, не относящийся к .NET, который компилируется для прямого машинного кода.

Длинный ответ:

Что такое управляемый код?

Управляемый код - это то, что создают компиляторы Visual Basic .NET и C #. Он компилируется в промежуточный язык (IL), а не в машинный код, который может выполняться непосредственно на вашем компьютере. CIL хранится в файле, называемом сборкой, вместе с метаданными, описывающими классы, методы и атрибуты (например, требования безопасности) созданного вами кода. Эта сборка представляет собой универсальную единицу развертывания в мире .NET. Вы копируете его на другой сервер, чтобы развернуть там сборку, и часто это копирование является единственным этапом развертывания.

Управляемый код выполняется в Common Language Runtime. Среда выполнения предлагает широкий спектр услуг для вашего исполняемого кода. Обычно он сначала загружает и проверяет сборку, чтобы убедиться, что CIL в порядке. Затем, как раз вовремя, когда методы вызываются, среда выполнения организует их компиляцию в машинный код, подходящий для машины, на которой выполняется сборка, и кэширует этот машинный код для использования при следующем вызове метода. (Это называется Just In Time, или JIT-компиляцией, или часто просто Jitting.)

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

Visual Basic .NET и C # могут создавать только управляемый код.Если вы работаете с этими приложениями, вы создаете управляемый код. Visual C ++ .NET может создавать управляемый код, если хотите: при создании проекта выберите один из типов приложений, имя которого начинается с .Managed., Например .Managed C ++ application ..

Что такое неуправляемый код?

Неуправляемый код - это то, что вы использовали для создания до выпуска Visual Studio .NET 2002. Visual Basic 6, Visual C ++ 6, черт возьми, даже тот компилятор C 15-летней давности, который вы, возможно, все еще копошит на своем жестком диске, создавал неуправляемый код. Он скомпилирован непосредственно в машинный код, который запускается на машине, на которой вы его скомпилировали, и на других машинах, если они имеют такой же или почти одинаковый чип. Он не получал таких услуг, как безопасность или управление памятью, из невидимой среды выполнения; он получил их от операционной системы. И что немаловажно, он получил их из операционной системы явно, запрашивая их, обычно путем вызова API, предоставленного в Windows SDK. Более поздние неуправляемые приложения получали службы операционной системы через вызовы COM.

В отличие от других языков Microsoft в Visual Studio, Visual C ++ может создавать неуправляемые приложения. Когда вы создаете проект и выбираете тип приложения, имя которого начинается с MFC, ATL или Win32, вы создаете неуправляемое приложение.

Это может привести к некоторой путанице: когда вы создаете приложение .Managed C ++, продукт сборки представляет собой сборку CIL с расширением .exe. При создании приложения MFC продукт сборки представляет собой исполняемый файл собственного кода Windows, также с расширением .exe.Внутреннее расположение двух файлов совершенно разное. Вы можете использовать дизассемблер промежуточного языка, ildasm, чтобы заглянуть внутрь сборки и увидеть метаданные и CIL. Попробуйте указать ildasm на неуправляемый исполняемый файл, и вам сообщат, что он не имеет допустимого заголовка CLR (Common Language Runtime) и не может быть разобран - то же расширение, совершенно разные файлы.

А как насчет собственного кода?

Фраза «собственный код» используется в двух контекстах. Многие люди используют его как синоним неуправляемого кода: код, созданный с помощью более старого инструмента или намеренно выбранный в Visual C ++, который не запускается во время выполнения, а вместо этого выполняется изначально на машине. Это может быть законченное приложение или компонент COM или DLL, который вызывается из управляемого кода с помощью COM Interop или PInvoke, двух мощных инструментов, которые гарантируют, что вы сможете использовать старый код при переходе в новый мир. Я предпочитаю говорить «неуправляемый код». для этого значения, потому что он подчеркивает, что код не получает услуги среды выполнения. Например, защита доступа для кода в управляемом коде не позволяет коду, загруженному с другого сервера, выполнять определенные деструктивные действия. Если ваше приложение обращается к неуправляемому коду, загруженному с другого сервера, вы не получите такой защиты.

Другое использование фразы «собственный код» - это описание вывода JIT-компилятора, машинного кода, который фактически выполняется во время выполнения. Это управляемо, но это не CIL, это машинный код. В результате не следует просто предполагать, что native = unmanaged.

( Источник )

146
ответ дан 24 November 2019 в 13:44
поделиться

Обычно управляемый код занимает больше памяти во время выполнения, чем эквивалентный хорошо написанный неуправляемый ( родной) код.

1
ответ дан 24 November 2019 в 13:44
поделиться

Это мог бы быть очень длинный ответ, говорящий о многих тонких различиях между машинным кодом, сгенерированным компилятором C, и машинным кодом, сгенерированным JIT-компилятором из управляемой программы. Достаточно долго, чтобы действительно потребоваться книга, но такие книги уже написаны. Что-нибудь, например, Джеффри Рихтера.

Я буду краток и понятен, потому что все эти тонкие различия сводятся к одному правилу:

Управляемый код - это код, который выделяет память из кучи со сборщиком мусора.

7
ответ дан 24 November 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: