[转]托管代码和非托管代码

哎是托管代码(managed code)?

      托管代码是一microsoft的中游语言(IL),他根本的企图是当.NET  
FRAMEWORK的集体语言运行库(CLR)执行代码前失去编译源代码,也就是说托管代码充当着翻译的企图,源代码在运行时候为简单只号:
      1.源代码编译为托管代码,(所以来代码可以有无数种,如VB,C#,J#)
      2.托管代码编译为microsoft的阳台专用语言。

     
编译器把代码编译成中等语言(IL),而未是力所能及一直以公的电脑上运行的机器码。中间语言让封闭装在一个为程序集(assembly)的文件中,程序集中包含了描述您所创办的类似,方法及性(例如安全需要)的兼具元数据。你可以拷贝这个程序集及其它一样尊服务器上配备其。

     
托管代码在官语言运行库(CLR)中运行。这个运行库给您的运作代码提供各种各样的劳动,通常来说,他会见加载与说明程序集,以之来管中语言的对。当某些方法为调用的当儿,运行库把实际的法子编译成适合当地电脑运行的机械码,然后会将编译好的机械码缓存起来,以全下次调用。(这就是是就经常编译)随着程序集的运行,运行库会持续地提供各种劳动,例如自动垃圾回收、运行库类型检查以及安全支持等。这些劳务帮扶提供单身为阳台与言语的、统一之托管代码应用程序行为。

      Visual Basic
.NET和C#唯其如此有托管代码。如果您用就好像语言形容程序,那么所发的代码就是托管代码。如果您肯,Visual
C++
.NET可以扭转托管代码。当你创造一个类型的当儿,选择名字是以.Managed开头的品种类别。例如.Managed
C++ application。

哎是非托管代码(unmanaged code)?

      非托管代码就是当Visual Studio .NET
2002颁发前所创造的代码。例如Visual Basic 6, Visual C++ 6,
最不好的凡,连那些依然残存在你的硬盘中、拥有超15年历史的陈旧C编译器所生的代码都是非托管代码。托管代码直接编译成靶子电脑的机械码,这些代码只能运行在编译出她的计算机及,或者是其他相同处理器或者几一模一样处理器的计算机及。非托管代码不能够享用一些运作库所提供的劳动,例如安全暨内存管理等。如果非托管代码用展开内存管理等于服务,就必显式地调用操作系统的接口,通常来说,它们会调用Windows
SDK所提供的API来实现。就最近之情况来拘禁,非托管程序会通过COM接口来取得操作系统服务。

      跟Visual Studio平台的外编程语言不等同,Visual
C++可以创造非托管程序。当您创造一个品类,并且选择名字为M
FC,ATL或者Win32上马的类类别,那么这类型所出的虽是非托管程序。

区别:

     1、托管代码是同一栽中语言,运行于CLR上;

          非托管代码被编译为机器码,运行于机上。

     2、托管代码独立于阳台及语言,能重新好的兑现不同语言平台内的匹配;

          非托管代码依赖让阳台及语言。

    
3、托管代码可享用CLR提供的劳务(如安全检测、垃圾回收等),不欲自己姣好这些操作;

          非托管代码需要协调提供安全检测、垃圾回收等操作。

      托管代码就意味着托管数据?答案是否认的。

      对于Visual
Basic和C#来说,生活是简单的,因为你无外选择。当您以那些语言里声明一个好像,那么是看似的实例会在托管堆中让创造,垃圾收集器(GC)会拉扯咱管理这些目标的回收。但是在Visual
C++中,你发外一个摘取。即使你刚好开创一个托管程序,你可操纵如何类是托管型,哪些类是非托管类型的。

这即是非托管类型:

class Foo {    private:       int x;    public:       Foo(): x(0){}
      Foo(int xx): x(xx) {} };

立刻虽是托管型

__gc class Bar {    private:       int x;    public:       Bar():
x(0){}       Bar(int xx): x(xx) {} };

     
他们唯一的分就是是类Bar的概念着生出__gc关键字。这个第一字会给代码带来巨大的界别。

     
托管型是可以为垃圾回收器所回收的。他们得使就此要字new来创造,永远都无见面以栈中出现。所以下这行代码是官的:

      Foo f;

      但是就一行代码就是不法的:

      Bar b;

      如果本身以积中开创一个Foo对象,那么自己必使各负其责清理是目标:

      Foo* pf = new Foo(2);       // . . .       delete pf;

     
C++编译器实际上会就此有限单堆放,一个托管堆和一个非托管堆,然后经对new操作符的重载来贯彻对创建不同类型类的实例,分配不同的内存。如果我在积中创建一个Bar实例,那么我得以忽略它。当没有外代码在用它们的时,垃圾回收器会自动清理是看似,释放其占用的资源。
对于托管型会发生局部束缚:它们不克落实多更继承,或者接续给非托管类型;它们不能够因此friend关键字来落实个人访问,它们不克实现拷贝构造函数。所以,你出或未思把你的近乎声明也托管型。但是就并无表示你无思叫您的代码成为托管代码。在Visual
C++中,你可以选取。

      托管代码和非托管代码的特性比      
基本上每个人还亮之凡,所有.Net语言都将受编译成为一个叫做IL汇编的中档语言。但是电脑是怎么履行之中间代码的,却是无数口不明了,甚至理解错了之。
     
JIT是.NET程序运行的最主要部件之一,全称是就是经常编译器。很多人(绝对免是个别,问了许多c++程序员,10独发9个这种想法)都以为JIT其实就是跟Java
VM差不多的东西,是一个Interpreter,在运行时读取IL汇编代码,然后模拟成x86代码(也即是俗称的虚拟机)。但是事实上,.NET使用的是越来越高级的技艺。
.Net程序让加载入内存以后,当有段IL代码被第一潮运行的时段,JIT编译器就会见将立即段IL代码,全部编译成本地代码,然后重新实践。这吗不怕是为什么.NET程序第一次于运行都启动老缓慢的缘由!
随.NET库,微软还捎带了一个工具,可以先用.NET程序有所的IL代码都编译成本地代码并保留于缓存区中,这样一来,这个顺序即使与c++编译的等同模型一样了,没有外区别,运行时为可以退JIT了(这里并非混淆了,这里不是说得脱离.NET库,而是说非需要在拓展即经常编译这个历程了)。所以,请不要将.NET和Java混为一谈,两独的周转效率根本无是一个级的!

    
JIT的优化乘的凡得针对本地CPU,在编译时进行优化。传统程序在编译时,为了确保兼容性,通常使用最通用的指令集(比如古老的386指令集)来编译。而JIT知道CPU的实际项目,可以充分利用这些附加指令集进行编译,这样的性提升是老大惊人之。