zoukankan      html  css  js  c++  java
  • 【M29】引用计数

    1、引用计数这项技术,是为了让等值对象对象共享同一实体。此技术的发展有两个动机:a、记录堆上分配的对象,是垃圾回收机制的简单原理;b、节省内存,多个对象具有相同的值,存储多次很笨。速度更快,等值对象避免了对象复制,也就减少了构造和析构。

    2、考虑,基于引用计数的String,String类中有个StringValue指针,stringValue包含char指针data和引用计数refCount。注意,refCount属于StringValue,不应该属于String,否则要有多个引用计数副本,还要保持同步。

    3、考虑下面的问题,多个String共享同一个StringValue,如果只是读取操作,没问题。如果是写操作,修改其中一个String,我们期望其他的String不变。怎么办?
      这种情况下,不能再共享了。必须构造出一个副本出来,修改副本,其他的String仍然共享。这就是Copy-On-Write,写时才复制。这也是缓式评估的一个例子。
      问题又来了,对于String的操作[],如何区分读还是写呢?
      使用代理类,CharProxy,copy赋值是写操作,隐式类型转换操作符是读操作。

    4、还有一个问题,那就是先读取String的字符,取地址,在后面再去修改字符。这种情况下,检测不出来。该怎么呢?
    默认情况下,StringValue是可以共享的,一旦取出其中的字符,StringValue标记是不能共享的,复制的时候必须深复制。

    5、考虑代码复用,可以产生一个父类RCObject。

    6、引用计数技术,本身需要付出一些代价。它的使用场景是:相对多的对象共享相当少的实值,对象实值构造析构成本大。

  • 相关阅读:
    NOIP 2012 文化之旅
    史上最全的各种C++ STL容器全解析
    详解C++ STL map 容器
    详解C++ STL priority_queue 容器
    浅谈C++ STL stack 容器
    浅谈C++ STL queue 容器
    浅谈C++ STL vector 容器
    CF1185F Two Pizzas
    浅谈C++ STL deque 容器
    详解C++ STL multiset 容器
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3654406.html
Copyright © 2011-2022 走看看