浅谈托管和非托管区别

一、托管代码和非托管代码

所谓托管代码,即可以通过CLR的GC来释放所有资源的代码,开发者无需过度关注资源的释放。而至于非托管代码,比如操作系统代码、C#中的Socket、Stream等,这些代码无法通过CLR的CG完全释放占用的资源。一般来说,非托管的功能都被包装过了,比如当我们访问文件的时候,肯定不会直接使用操作系统的CreateFile函数,而是使用System.IO.File类。让用户直接使用的非托管功能确实非常少见。由于CLR提供了垃圾收集,随之带来的一个特性就是内存安全。所谓内存安全,即程序只访问已申请的内存。这也就意味着,不会存在任何野指针。

托管代码——>中间语言(CIL)—(CLR)—>microsoft的平台专用语言,机器代码

VS编写的源代码(不只是C#,也包括.net平台上的其他语言,如VB,J#等),首先经过编译器把代码编译成中间语言(CIL,又称IL)。

CLR在对CIL语言代码进行编译前,需要先将编译的环境运行起来并对程序集进行一个读取过程,这个读取过程其实也就描述出了程序集中的一个基本构造。

CLR(公共语言运行时)

当方法被调用时,公共语言运行库CLR把具体的方法编译成适合本地计算机运行的机器码,并且将编译好的机器码缓存起来,以备下次调用使用。

非托管代码——>机器码

运行在CLR环境外部,直接编译成目标计算机码,由操作系统直接执行的代码,代码必须自己提供垃圾回收,类型检查,安全支持等服务。

如需要内存管理等服务,必须显示调用操作系统的接口,通常调用Windows SDK所提供的API来实现内存管理。 

二、托管和非托管是计算机编程中的两个术语,通常用于描述内存管理的方式。

以下是它们的主要区别:

  1. 内存管理

    • 托管:托管内存指的是由运行时环境(如.NET的CLR或Java的JVM)自动管理的内存。这意味着内存的分配和释放不需要程序员手动干预,运行时环境会负责垃圾回收等操作。
    • 非托管:非托管内存则需要程序员手动管理,包括分配和释放内存。这通常涉及到使用如C或C++语言中的mallocfree函数。
  2. 性能

    • 托管内存可能会引入一些性能开销,因为运行时需要跟踪对象的生命周期并进行垃圾回收。
    • 非托管内存允许更精细的控制,程序员可以根据需要优化内存使用,但这也可能导致内存泄漏或其他内存管理错误。
  3. 安全性

    • 托管内存通常更安全,因为它可以防止一些常见的内存错误,如使用后释放(use-after-free)和内存泄漏。
    • 非托管内存由于需要手动管理,如果程序员不够小心,更容易出现安全问题。
  4. 语言和平台

    • 托管内存的概念多出现在高级编程语言中,如C#、Java、Python等。
    • 非托管内存则常见于系统编程语言,如C和C++,它们提供了对硬件和内存的更直接的控制。
  5. 垃圾回收

    • 托管环境通常包含垃圾回收机制,自动回收不再使用的对象。
    • 非托管环境中,程序员需要自己负责释放不再需要的内存。
  6. 适用场景

    • 托管内存适合需要快速开发和较少关注性能细节的场景。
    • 非托管内存适合对性能要求极高的场景,或者需要与硬件紧密交互的场合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CN.LG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值