1.源代码编译为托管代码。      1.源代码编译为托管代码。

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

【转】托管代码和非托管代码的界别

 

嗬是托管代码(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的切切实实项目,可以充分利用这些附加指令集进行编译,这样的性质提升是可怜可观之。

      如果自身于积着创造一个Foo对象,那么自己要要当清理是目标:

      托管代码是一microsoft的中等语言(IL),他第一的图是在.NET  
FRAMEWORK的公共语言运行库(CLR)执行代码前失去编译源代码,也就是说托管代码充当着翻译的意向,源代码在运作时候为寡单级次:
      1.源代码编译为托管代码,(所以来代码可以出许多栽,如VB,C#,J#)
      2.托管代码编译为microsoft的平台专用语言。

     
C++编译器实际上会因此有限只堆放,一个托管堆和一个非托管堆,然后经过对new操作符的重载来兑现对创建不同类型类的实例,分配不同之内存。如果自身于积中创建一个Bar实例,那么自己可忽略她。当没有另外代码在采用它的时,垃圾回收器会自动清理是仿佛,释放其占据的资源。
对于托管型会起有约:它们不可知实现多再度继承,或者接续给非托管类型;它们不克为此friend关键字来落实个人访问,它们不可知实现拷贝构造函数。所以,你来或无思将您的接近声明也托管型。但是这并无意味着你莫思吃你的代码成为托管代码。在Visual
C++中,你可挑选。

      跟Visual Studio平台的别编程语言不雷同,Visual
C++可以创建非托管程序。当你创造一个项目,并且选择名字为M
FC,ATL或者Win32从头的类项目,那么这类型所来的便是非托管程序。

立刻就是托管型

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

     
托管型是得被垃圾回收器所回收的。他们必须要因此要字new来创造,永远都非会见当栈中出现。所以下这行代码是官方的:

     
编译器把代码编译成中语言(IL),而非是能够一直在你的微机及运行的机器码。中间语言让封闭装于一个于程序集(assembly)的文件被,程序集中包含了描述而所创建的近乎,方法及属性(例如安全需要)的持有元数据。你得拷贝这个程序集至任何一样大服务器上部署其。

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

    
JIT的优化乘的是可以对当地CPU,在编译时展开优化。传统程序于编译时,为了保险兼容性,通常用最通用的指令集(比如古老的386指令集)来编译。而JIT知道CPU的求实品种,可以充分利用这些附加指令集进行编译,这样的性提升是坏可观的。

      Foo f;

哟是托管代码(managed code)?

    
3、托管代码可享受CLR提供的服务(如安全检测、垃圾回收等),不待自己得这些操作;

      但是就一行代码就是伪的:

就即是非托管类型:

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

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

     2、托管代码独立为阳台以及语言,能重新好之落实不同语言平台间的匹配;

      托管代码和非托管代码的属性于      
基本上每个人且知的凡,所有.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混为一谈,两个的周转效率根本不是一个流的!

     
托管代码在国有语言运行库(CLR)中运作。这个运行库给你的运转代码提供各种各样的服务,通常来说,他会加载与说明程序集,以这个来管中语言的正确性。当一些方法让调用的时节,运行库把具体的艺术编译成符合本地电脑运行的机械码,然后会拿编译好的机械码缓存起来,以全下次调用。(这就是不怕经常编译)随着程序集的周转,运行库会持续地提供各种劳动,例如自动垃圾回收、运行库类型检查与平安支持等。这些劳务帮扶提供单身为阳台与言语的、统一之托管代码应用程序行为。

      Visual Basic
.NET和C#唯其如此有托管代码。如果您用这类似语言描绘程序,那么所产生的代码就是托管代码。如果你愿意,Visual
C++
.NET可以变更托管代码。当您创造一个种类的时候,选择名字是以.Managed开头的类别项目。例如.Managed
C++ application。

好家伙是非托管代码(unmanaged code)?

      Bar b;

      对于Visual
Basic和C#来说,生活是简单的,因为若未曾其余选择。当您于那些语言中声明一个看似,那么这类似的实例会以托管堆着受创造,垃圾收集器(GC)会帮助咱管理这些目标的回收。但是当Visual
C++中,你来外一个抉择。即使你碰巧开创一个托管程序,你可操纵哪些类是托管型,哪些类是非托管类型的。

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

区别:

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

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

      非托管代码就是在Visual Studio .NET
2002宣布之前所创办的代码。例如Visual Basic 6, Visual C++ 6,
最糟糕的凡,连那些还残存在你的硬盘中、拥有超过15年历史的陈旧C编译器所产生的代码都是非托管代码。托管代码直接编译成靶子电脑的机械码,这些代码只能运行在编译出她的电脑及,或者是另相同处理器或者几一模一样处理器的微处理器上。非托管代码不可知分享一些运转库所提供的劳动,例如安全与内存管理等于。如果非托管代码用展开内存管理等劳务,就亟须显式地调用操作系统的接口,通常来说,它们会调用Windows
SDK所提供的API来兑现。就日前的情来拘禁,非托管程序会通过COM接口来赢得操作系统服务。

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

相关文章