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

什么是托管代码?他与非托管代码有何区别? 托管代码提供了许多高级特性和便利,如自动内存管理、类型安全等,使得开发更加高效且不易出错。但它依赖于CLR,可能会带来一些性能开销。非托管代码提供了更高的灵活性和性能,因为它可以直接与操作系统交互。然而,这也要求开发者对内存管理和其他底层细节有更多的了解和控制。选择使用哪种代码取决于具体的应用场景和需求。对于大多数现代应用程序开发,尤其是Web应用和服务端应用,.NET平台下的托管代码是一个非常不错的选择。而对于需要高性能、低级别控制或者特定硬件访问的场合,非托管代码可能是更好的选择。 阅读详情


什么是托管代码(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的具体类型,可以充分利用这些附加指令集进行编译,这样的性能提升是很可观的。

vnpy二次开发实战:选股、回测与机器学习全流程拆解 在量化交易领域,vnpy作为开源交易系统,其事件驱动架构和模块化设计为二次开发提供了广阔空间。开发者常需理解Engine、App与策略模板的挂载链路,才能实现从单标的到多股票池的扩展。本文从vnpy核心机制出发,阐述如何利用RPS相对强度指标与因子打分完成股票池初筛,再通过随机森林等日频因子构建机器学习增强模型,提升选股鲁棒性。同时,针对多股回测场景,对比原生BacktestingEngine的局限,给出轻量组合回测器的设计方案。工程实践中,时间戳、复权、未来函数、滑点设置、标签泄漏等都是导致策略失效的高频 阅读详情

相关推荐

C#中托管DLL和非托管DLL的区别详解

首先解释一下,托管DLL和非托管DLL的区别。狭义解释讲,托管DLL就在Dotnet环境生成的DLL文件。非托管DLL不是在Dotnet环境生成的DLL文件。 托管DLL文件,可以在Dotnet环境通过 “添加引用” 的方式,直接把托管DLL文件添加到项目中。然后通过 Using DLL命 名空间,来调用相应的DLL对象 。  非托管DLL文件,在Dotnet环境应用时,通过 DllImport 调用。 C# 调用非托管DLL文件。DLL文件是用C语言编写的。 托管DLL就是能够在公共语言运行库(Common Language Runtime,简称CLR)中能够直接引用的,并且扩展名为“DL

托管代码和非托管代码的区别

托管代码和非托管代码的区别 这一篇关于“托管代码和非托管代码的区别”文章,是我看过的讲得比较清楚的文章,推荐有趣的同行读一读 什么是托管代码? 托管代码是一microsoft的中间语言,他主要的作用是在.NET FRAMEWORK的CLR执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段: 1.源代码编...

weixin_34062329的博客 670

ADS学习笔记 1. 功率放大器设计

基于ADS2023 update2的学习笔记1.功率放大器设计

u014087103的博客 1万+

浅谈托管和非托管区别

而至于非托管代码,比如操作系统代码、C#中的Socket、Stream等,这些代码无法通过CLR的CG完全释放占用的资源。一般来说,非托管的功能都被包装过了,比如当我们访问文件的时候,肯定不会直接使用操作系统的CreateFile函数,而是使用System.IO.File类。的源代码(不只是C#,也包括.net平台上的其他语言,如VB,J#等),首先经过编译器把代码编译成中间语言(CIL,又称IL)。,直接编译成目标计算机码,由操作系统直接执行的代码,代码必须自己提供垃圾回收,类型检查,安全支持等服务。

a876106354的博客 1159

基于OpenCV的驾驶疲劳检测与预警系统设计

PERCLOS(Percentage of Eye Closure)是一种基于眼睑闭合程度的疲劳度量指标。在基于OpenCV的驾驶疲劳检测与预警系统设计中,PERCLOS可以用于检测驾驶员的眼睑闭合程度,以判断其是否疲劳。该函数用于检测视频流中人脸的疲劳程度。具体地,该函数通过检测人脸的眼睛和嘴巴的状态来评估人脸的疲劳程度。眼睛状态是通过计算眼睛的长宽比(eyear)来判断,如果长宽比小于某个阈值,则认为眼睛闭合,表示人处于疲劳状态。

2301_79810943的博客 2327

1.triton镜像使用

1)拉取镜像2)启动容器指定模型仓库时可以执行server下的./fetch_model.sh,见2.2部分GPU版本的启动CPU版本的启动区别只在于--gpus=1这个参数注意:docker19.03之前的版本使用gpu要指定显卡硬件名,docker19.03之后的需要安装nvidia-container-toolkit或nvidia-container-runtime安装之后要重启docker查看gpus参数是否安装成功重新执行我遇到了如下错误先使用非GPU版本的。

天启的博客 2077

C#中什么是非托管代码?托管代码和非托管代码有什么区别

COM(Component Object Model)组件:COM 是一种面向对象的二进制接口标准,可以编写使用 C/C++ 编写的 COM 组件,并通过 Interop Services 在 C# 中调用。这种方式常用于与操作系统交互、进行系统级编程等。这些是C# 中使用非托管代码的一些常见场景,包括调用 C/C++ 动态链接库函数、使用 COM 组件、以及调用 Win32 API 函数。在C#中,托管代码和非托管代码是两种不同类型的代码,它们在内存管理和执行环境上有所不同。)技术在 C# 中调用。

一个专注于技术研究创新的程序员 2765

第五章 TTM 后备管理:5.6系统内存域

系统内存域由 TTM 内置资源管理器管理,通过 ttm_tt 承载页信息,依赖 ttm_pool 提供物理页。ttm_tt 管理页数组、缓存属性与状态标志,支持外部页与换出机制。初始化分 ttm_tt_init 与 ttm_sg_tt_init,生命周期包括创建、填充、释放与销毁。页池针对 write-combined、uncached 及一致性 DMA 分配的页进行缓存,提升性能并减少 TLB 刷新。分配时高阶优先、批量设置缓存属性,回收时清零后归还池中,确保高效复用。

图形/计算GPU的驱动与虚拟化技术分享园地 2568

托管与非托管代码的区别

Unity 性能优化 系列(二)DrawCall

剑鬼鬼的博客 3944

Dify框架面试内容整理-如何优化Dify的应用性能?

为1536维)可选用 PCA、FAISS 的量化压缩方法降低维度(如128、256、512);对知识库预览、任务流配置等页面,使用 nginx/cache-control 减少请求。API 响应耗时(P50/P95)、Token 使用量、缓存命中率、向量检索耗时;对 Prompt+输入内容计算 Hash,缓存相同请求的返回结果;使用占位符 + 函数拼接,按需组合 Prompt,而非静态长模板;数据量大时,应在构建索引前清洗冗余段落、统一格式,避免重复向量。维度越低,检索越快,但可能影响召回准确度,需平衡。

不务正业的猿 1550

高速PCB设计中的一些常用规则

目前,高速PCB产品设计中,高速接口的应用日益普及,对于复杂的设计而言,高速走线就如同“蜘蛛网”一样密布在PCB各处,因此,在进行PCB检查及评审时,必要的高速PCB设计经验法则及规则是工程师开展工作必不可少的知识储备。

一只豌豆象的博客 3415

开尔文四线法在精密电阻测量中的应用与BMS/ATE实践

在电子测量中,低阻值电阻的精确测量常受引线电阻和接触电阻干扰,导致系统误差。开尔文四线法通过分离电流激励与电压检测回路,有效消除寄生电阻影响,成为精密测量的基础技术。其原理基于欧姆定律,利用恒流源和高压输入阻抗电压表,实现高精度电阻测量。该技术广泛应用于BMS分流电阻校准、ATE多site测试及HIL验证等场景,确保系统级精度。本文深入解析四线法的原理、实操细节及常见问题,助力工程师提升测量可靠性。

weixin_33863087的博客 326

30天Python入门(第一天:Python入门)

30天带你入门Python,这是第一天

Science prince的博客 584

【转】.Net 托管代码和非托管代码的区别

什么是托管代码(managed code)?       托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET   FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段:       1.源代码编译为托管代码,(所以源代码可以有很多种,如VB,C#,J#)       2.托管代码编译为micros

wangyan9110's Blog 791

开心消消乐

1)当点击一个1时,该1变被反转为0,同时相邻的上、下、左、右,以及左上、左下、右上、右下8个方向的1(如果存在1)均会自动反转为0;2)进一步地,一个位置上的1被反转为0时,与其相邻的8个方向的1(如果存在1)均会自动反转为0;上述样例中,四个角上的1均在中间的1的相邻8个方向上,因此只需要点击一次即可。给定一个N行M列的二维矩阵,矩阵中每个位置的数字取值为0或1。在上述4 * 4的矩阵中,只需要点击2次,即可将所有的1进行消除。接下来N行表示矩阵的初始值,每行均为M个数,取值范围[0,1]

面试高手的博客 2729

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【转】托管代码和非托管代码的区别 2012-3-19 16:45

什么是托管代码(managed code)? 托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段: 1.源代码编译为托管代码,(所以源代码可以有很多种,如VB,C#,J#) 2.托管代码编译为microsoft的平台专用语言。 编译器把代码编

laohu6599的专栏 756

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【转】编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源...

建议50:在Dispose模式中应区别对待托管资源和非托管资源 真正资源释放代码的那个虚方法是带一个bool参数的,带这个参数,是因为我们在资源释放时要区别对待托管资源和非托管资源。 提供给调用者调用的显式释放资源的无参Dispose方法中,调用参数是true: public void Dispose() { /...

dianzhuique8587的博客 99

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

unity项目托管代码和非托管代码之间的数据传递原理刨析

Unity3D 的架构通过 Mono Runtime 将托管代码(C#)与非托管代码(C++)连接起来,使得开发者能够利用 C# 的易用性和安全性,同时也能访问底层的高性能功能。这样的设计使得 Unity3D 成为一个强大且灵活的游戏开发平台,适合各种类型的游戏开发。Mono Runtime 在 Unity 中的作用是作为桥梁,将托管代码(C#)与非托管代码(C++)连接起来。通过 P/Invoke 和其他机制,开发者可以在 C# 中调用 C++ 函数,从而充分利用两种语言的优势,构建高性能的应用程序。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1425

C#托管代码和非托管代码的区别

【前置知识】 写好的程序在运行的时候会经过以下过程(即C#编译过程): 源代码(即用C#语言写好的代码)被C#编译器转换为公共中间语言(Common Intermediate Language,CIL)代码 CIL代码被公共语言运行库(Common Language Runtime,CLR)转换为机器码 (注解:【A】说法上,公共...

enternalstar的博客 2993
上一篇: C#程序实现动态调用DLL的研究
下一篇: 关于Dll、Com组件、托管dll和非托管dll的理解
hongyanjava
博客等级 码龄17年 12粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值