C# vs C++之二:GC vs RAII
2010-09-30 20:49:59 来源:WEB开发网资源管理
在C语言中,资源管理是一个极为繁琐易错的工作,大多复杂的C系统都面临着内存泄露、悬挂指针等问题。这是一方面是由底层语言的特点决定;另一方面也是由于C语言特性相对较少,严重依赖程序员进行正确的资源管理,缺乏有效的支持手段。
C#和C++两门语言的定位不同,它们在资源管理方面采取了两种截然不同的方式:一为GC,一为RAII。GC让程序建立在更高的抽象层次上,使资源管理变得更方便,更安全;而RAII则保留了C的底层能力,同时在C++特性的支持下提供了简单有效的资源管理方式。我们知道C++最激烈的批评往往来自于C社区,而在我看来C程序员可以不接受虚函数,不接受模板,但有什么理由不接受RAII呢?可以说RAII是C++相对C来说几乎无副作用的明显进步。
下面就从GC开始:
引用代替指针
C#通过CLR管理托管内存,用引用抽象代替指针间接操作托管内存,让程序员在更高的层次上安全地使用资源。这使得C#失去了直接管理内存的能力,但换来了以下好处:
1.类型安全:在C/C++中可以通过类型转换把整数或其他类型的指针转换为特定类型的指针,这意味着指针是非类型安全的,必须由程序员来保证指针代表的内存空间的合法性。而C#引用可以看作是类型安全的指针,as运算符可以保证转换的类型安全性。
2.内存整理:创建对象需要从堆中动态分配连续的内存空间,由于不同对象的内存大小是不同的,常见的首次匹配和最优匹配堆分配算法都会造成堆中的内存碎片问题。碎片的存在使实际可用内存小于物理内存,所以应尽量减少碎片的产生。一个方向是设计更好的内存分配算法;另一个方向是通过周期性地进行内存整理调整优化。在C/C++中,由于指针代表了绝对地址,因此不存在通用的内存整理算法;而C#屏蔽了指针,通过引用操作对象,就使得内存整理成为可能。PS:这并不意味着C/C++内存分配就弱于C#,C/C++程序可以为某种类型的对象设计专用的内存分配方式,甚至把对象指定分配到某一物理地址空间,这些都是C#不具备的。
- ››VSFTP服务器配置详解
- ››gcc内置的for each
- ››VS2008 安装失败(“Web 创作组件”无法)的解决办...
- ››VS调用存储过程
- ››VS2005无法远程连接SQL数据库问题
- ››VS2010 Express中文版已经发布至MSDN
- ››VS2008C# 开发 Windows Mobile 6.0程序应注意的几...
- ››VS08中最简单也最实用的Ajax无刷新技术
- ››VS2003+nds OR VS2003+carbide.vs 开发 Symbian 程...
- ››VS2008 平台下进行 Windows Mobile 开发环境的搭建...
- ››VS 2010/.NET 4 RC版 发布了
- ››VS 2010的Intellisense相关崩溃的修补
更多精彩
赞助商链接