MoreEffectiveC++之引用計數(shù)

字號:

Reference counting讓我想起了Java,當如果想用C++來實現(xiàn)Java的能力的話,那Reference counting必不可少。Reference counting可以節(jié)省程序的運行成本,大量的構造、析構、分配、釋放和拷貝的代價被省略。
    實現(xiàn)
    classRCObject
    {
    public:
    RCObject():refCount(0),shareable(true){}
    RCObject(constRCObject&):refCount(0),shareable(true){}
    RCObject& operator=(constRCObject& rhs){return *this;}
    virtual ~RCObject()=0;
    void AddReference(){++refCount;}
    void RemoveReference(){if (--refCount == 0) deletethis;}
    void markUnshareable(){shareable = false;}
    bool isShareable() const{returnshareable;}
    bool isShared() const {returnrefCount > 1;}
    private:
    int refCount;
    bool shareable;
    };
    RCObject::~RCObject(){}
    template
    class RCPtr
    {
    public:
    RCPtr(T* realPtr = 0):pointee(realPtr){init();}
    RCPtr(constRCPtr& rhs):pointee(rhs.pointee){init();}
    ~RCPtr(){if (pointee) pointee->RemoveReference();}
    RCPtr& operator = (constRCPtr& rhs)
    {
    if (pointee!=rhs.pointee)
    {
     if (pointee)
    pointee->RemoveReference();
    pointee = rhs.pointee;
    init();
    }
    return *this;
    }
    T* operator->() const { returnpointee;}
    T& operator*() const{return *pointee;}
    private:
    T* pointee;
    void init()
    {
    if (pointee == 0)
     return;
    if (pointee->isShareable() == false)
     pointee = newT(*pointee);
    pointee->AddReference();
    }
    };
    class String
    {
    public:
    String(const char* value = ""):value(newStringValue(value)){}
    const char& operator[](intnIndex) const
    {
    return value->data[nIndex];
    }
    char& operator[](intnIndex)
    {
    if (value->isShared())
     value = newStringValue(value->data);
     value->markUnshareable();
     returnvalue->data[nIndex];
    }
    protected:
    private:
    struct StringValue:publicRCObject
    {
    char* data;
    String Value(constchar* initValue)
    {
     init(initValue);
    }
    String Value(constStringValue& rhs)
    {
     init(rhs.data);
    }
    void init(constchar * initValue)
    {
     data = newchar[strlen(initValue) + 1];
     strcpy(data,initValue);
    }
    ~String Value()
    {
     delete [] data;
    }
    };
    RCPtr value;
    };
    這是Meyers給出的String的實現(xiàn),然而我的觀點是如果沒有特別的必要的話,對stirng不要使用引用計數(shù),因為在多線程程序中同步的代價要大于引用計數(shù)本身的好處,得不償失。