计算机二级辅导:c 智能指针计算机等级考试

文章作者 100test 发表时间 2010:01:08 18:39:03
来源 100Test.Com百考试题网


  Smart Pointer是C 中的一个大题目,要说清楚他的所有好处很需要费点力气。我就一个功能一个功能的说。有我理解不透的地方希望大家指点。

  copy-to-write

  当生成一个C object的时候如果这个class很大,这个object会占用很多空间。那么每生成一个就占用一片空间,这样会占用很多系统资源。同时降低效率。一个解决方法就是对用拷贝构造函数生成的object,让他不存储数据,而只存储一个指向原来object数据的指针。这样空间就节省了很多。但问题在于这样两个object完全联结在了一起。如果修改了其中一个,另一个也跟着变了。所以这种方法不可取。这里讲的copy-to-write技术就是解决这类问题的方法。当通过引用一个已有object去拷贝构造新object时,新 object只有一个指向已有object的指针。这两个object共享数据。直到其中一个需要修改数据的时候,再把这两块数据分离。这里举一个最简化的例子。假设一个class叫CLargeObject,里面存有很多数据。我们用一个inner class来把所有数据放在一起,叫CData。CData里面存有大量数据,例如一个数据库。这里用最简单的模型来表示,假设只有一个整数int m_nVal. CData里面需要包含另一个变量。叫作索引数目(reference count)。它记录了指向这个CData object的来自CLargetObject类的指针各数。也就是说,总共有多少CLargeObject的object正在引用着当前的CData object。

  class CLargeObject

  {

  private:

  struct CData

  {

  private:

  int m_nVal.

  int m_nReferenceCount.

  }

  }.

  对于每个CLargeObject的object,我们用一个CData类的指针来指向其数据。

  CData *m_pData.

  CLargeObject至少有两个构造函数。第一个是标准的构造函数,初始化其数据。这时数据是唯一的,所以必须新生成一个CData的object来存储数据。

  CLargeObject::CLargeObject(int nVal)

  {

  m_pData = new Data(nVal).

  }

  而对于CData类的构造函数而言,初始化他的CLargeObject是第一个指向他的,这一时刻索引数目m_nReferenceCount是1。

  CLargeObject::Data::Data(int nVal) : m_nVal(nVal), m_nReferenceCount(1) {}

  CLargeObject的第二个构造函数是拷贝构造(copy constructor)。这样生成的object不需要有新的数据,和已有的object共享数据就可以了。这是索引数目需要加1。表示又有一个object指向当前的CData了。

  CLargeObject::CLargeObject(const CLargeObject


相关文章


VC隐藏文件和判断文件是否存在计算机等级考试
C语言实例编程绘制余弦曲线计算机等级考试
C 调用C#的DLL程序方法计算机等级考试
简单的C 病毒代码计算机等级考试
计算机二级辅导:c 智能指针计算机等级考试
关于C语言中的无符号数和有符号数计算机等级考试
char**p和constchar**p类型不相容计算机等级考试
制作Javascript弹出窗口技巧九则计算机等级考试
Java调用com组件操作word使用总结计算机等级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛