Я иногда слышу / читаю об этом, когда говорю о .NET, например, об «управляемом коде» и «неуправляемом коде», но я понятия не имею, что это такое и в чем их различия. В чем их отличие по определению? Каковы последствия использования любого из них? Это различие существует только в .NET / Windows?
139
Ответы:
Управляемый код
Управляемый код - это то, что создают компиляторы Visual Basic .NET и C #. Он работает в среде CLR (Common Language Runtime), которая, помимо прочего, предлагает такие услуги, как сборка мусора, проверка типов во время выполнения и проверка ссылок. Думайте об этом так: «Мой код управляется средой CLR».
Visual Basic и C # могут создавать только управляемый код, поэтому, если вы пишете приложение на одном из этих языков, вы пишете приложение, управляемое CLR. Если вы пишете приложение на Visual C ++ .NET, вы можете создавать управляемый код, если хотите, но это необязательно.
Неуправляемый код
Неуправляемый код компилируется прямо в машинный код. Таким образом, согласно этому определению весь код, скомпилированный традиционными компиляторами C / C ++, является «неуправляемым кодом». Кроме того, поскольку он компилируется в машинный код, а не в промежуточный язык, он не переносится.
Никакого управления свободной памятью или чего-либо еще, что предоставляет CLR.
Поскольку вы не можете создать неуправляемый код с помощью Visual Basic или C #, в Visual Studio весь неуправляемый код написан на C / C ++.
Смешивание двух
Поскольку Visual C ++ может быть скомпилирован как в управляемый, так и в неуправляемый код, их можно смешивать в одном приложении. Это стирает грань между ними и усложняет определение, но об этом стоит упомянуть, чтобы вы знали, что у вас все еще могут быть утечки памяти, если, например, вы используете стороннюю библиотеку с каким-то плохо написанным неуправляемым кодом.
Вот пример, который я нашел в Google :
#using <mscorlib.dll> using namespace System; #include "stdio.h" void ManagedFunction() { printf("Hello, I'm managed in this section\n"); } #pragma unmanaged UnmanagedFunction() { printf("Hello, I am unmanaged through the wonder of IJW!\n"); ManagedFunction(); } #pragma managed int main() { UnmanagedFunction(); return 0; }
источник
Это более общий подход, чем .NET и Windows. Управляемая - это среда, в которой есть автоматическое управление памятью, сборка мусора, безопасность типов, ... неуправляемая - это все остальное. Так, например, .NET - это управляемая среда, а C / C ++ - неуправляемая.
источник
Управляемый код - это дифференциация, разработанная Microsoft для определения кода компьютерной программы, который требует и будет выполняться только под «управлением» виртуальной машины Common Language Runtime (что приводит к байт-коду).
http://en.wikipedia.org/wiki/Managed_code
http://www.developer.com/net/cplus/article.php/2197621/Managed-Unmanaged-Native-What-Kind-of-Code-Is-This.htm
источник