MoreEffectiveC++之引用计数 |
|
www.nanhushi.com 佚名 不详 |
Reference counting让我想起了Java,当如果想用C++来实现Java的能力的话,那Reference counting必不可少。Reference counting可以节省程序的运行成本,大量的构造、析构、分配、释放和拷贝的代价被省略。
实现
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 <classT> 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<StringValue> value; }; 这是Meyers给出的String的实现,然而我的观点是如果没有特别的必要的话,对stirng最好不要使用引用计数,因为在多线程程序中同步的代价要大于引用计数本身的好处,得不偿失。
|
|
|
文章录入:杜斌 责任编辑:杜斌 |
|
上一篇文章: MoreEffectiveC++之智能指针 下一篇文章: 细谈C++多态性的“动”与“静” |
【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
|
|