WEB开发网
开发学院软件开发C语言 C# vs C++之二:GC vs RAII 阅读

C# vs C++之二:GC vs RAII

 2010-09-30 20:49:59 来源:WEB开发网   
核心提示: RAIIRAII是resource acquisition is initialization的缩写,意为“资源获取即初始化”,C# vs C++之二:GC vs RAII(4),它是C++之父Bjarne Stroustrup提出的设计理念,其核心是把资源和对象的生命周

RAII

RAII是resource acquisition is initialization的缩写,意为“资源获取即初始化”。它是C++之父Bjarne Stroustrup提出的设计理念,其核心是把资源和对象的生命周期绑定,对象创建获取资源,对象销毁释放资源。在RAII的指导下,C++把底层的资源管理问题提升到了对象生命周期管理的更高层次。上面的例子,我们把new所获取的内存块视为资源,把r对象视为资源的代理对象,r应负责资源的获取和释放。在栈语义和操作符重载的支持下,C++的RAII体现出了简洁、安全、实时的特点:

1.概念简洁性:让资源(包括内存和非内存资源)和对象的生命周期绑定,资源类的设计者只需用在类定义内部处理资源问题,提高了程序的可维护性

2.类型安全性:通过资源代理对象包装资源(指针变量),并利用运算符重载提供指针运算方便使用,但对外暴露类型安全的接口

3.异常安全性:栈语义保证对象析构函数的调用,提高了程序的健壮性

4.释放实时性:和GC相比,RAII达到了和手动释放资源一样的实时性,因此可以承担底层开发的重任

也许你还在惊讶RAII如此简单的时候,关于RAII的主要内容已经介绍完了。简单不意味着简陋,在我看来RAII虽然不像GC一样,是一套具体的机制,但它蕴含的对象与资源关系的哲学深度的理解却使得我对Bjarne Stroustrup肃然起敬!

最后,不得不提醒RAII的理念固然简单,不过在具体实现的时候仍有需要小心的地方。比如对于STL的auto_ptr,可以视为资源的代理对象,auto_ptr对象间的赋值是一个需要特别注意的地方。简单说来资源代理对象间赋值的语义不满足“赋值相等”,其语义是资源管理权的转移。

什么是“赋值相等”呢?比如:

int a;

int b = 10;

a = b; //这句话执行后 a == b

但对于资源代理对象,这是不满足的,比如:

auto_ptr<int> a(null);

auto_ptr<int> b(new int(123));

a = b; //这句话执行后a != b,赋值的语义是b把资源的管理权交给了a

总结

对比介绍了C#和C++的资源管理方式:GC和RAII。

上一页  1 2 3 4 

Tags:vs GC vs

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接