Разница между «управляемым» и «неуправляемым»

Я иногда слышу / читаю об этом, когда говорю о .NET, например, «управляемый код» и «неуправляемый код», но я понятия не имею, чем они являются и в чем их отличия. В чем их разница, по определению? Каковы последствия использования любого из них? Существует ли это различие только в .NET / Windows?

137
задан bluish 7 March 2014 в 16:44
поделиться

3 ответа

Управляемый код

Управляемый код - это то, что создают компиляторы Visual Basic .NET и C #. Он работает в среде CLR (Common Language Runtime), которая, среди прочего, предлагает такие услуги, как сборка мусора, проверка типов во время выполнения и проверка ссылок.Итак, представьте себе: «Мой код управляется средой CLR».

Visual Basic и C # могут только создавать управляемый код, поэтому, если вы пишете application на одном из этих языков, вы пишете приложение, управляемое 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;
}
189
ответ дан 23 November 2019 в 23:33
поделиться

Это более общее, чем .NET и Windows. Управляемая — это среда, в которой у вас есть автоматическое управление памятью, сборка мусора, безопасность типов, ... неуправляемая — все остальное. Так, например, .NET — это управляемая среда, а C/C++ — неуправляемая.

81
ответ дан 23 November 2019 в 23:33
поделиться

Управляемый код — это дифференциация, придуманная 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

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

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