您好,登錄后才能下訂單哦!
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <Windows.h> //深拷貝 class String { public: String(const char* pData) : _pData(new char[strlen(pData) + 1]) { strcpy(_pData, pData); } String(const String& s)//拷貝構造,深拷貝,指針傳遞 : _pData(NULL) { String temp(s._pData); std::swap(_pData, temp._pData); } String& operator=(String s)//賦值運算符重載,深拷貝,值傳遞 { std::swap(_pData, s._pData); return *this; } ~String() { if (NULL != _pData) { delete[] _pData; _pData = NULL; } } private: char* _pData; };//深拷貝 //引用計數 namespace COW { class String { public: String(const char* pData) : _pData(new char[strlen(pData) + 1]) , _refCount(new int) { *_refCount = 1; strcpy(_pData, pData); } // String s2(s1); String(String& s)//s1和s2共用 : _pData(s._pData)//指向同一空間 , _refCount(s._refCount)//共用同一段引用計數 { ++(*_refCount); } // s1 = s2; String& operator=(String s) { if (this != &s) { if (--(*_refCount) == 0)//檢查這塊空間是否只有自己使用 { delete[] _pData; delete _refCount;//檢測完釋放歸還操作系統 } _pData = s._pData;//再指向另一塊空間 _refCount = s._refCount; ++(*_refCount); } return *this; } ~String() { if (--(*_refCount) == 0) { delete[] _pData; delete _refCount; } } private: char* _pData; int* _refCount; }; } //優化引用計數 class String { public: String(const char* pData) : _pData(new char[strlen(pData) + 5]) { *((int*)_pData) = 1; _pData += 4; // _pData = _pData + sizeof(char)*4; strcpy(_pData, pData); } // s2(s1); String(const String& s) : _pData(s._pData) { ++GetRef(); strcpy(_pData, s._pData); } // s2 = s3; String& operator=(const String& s) { if (this != &s) { if (--GetRef() == 0) { delete[](_pData - 4); } _pData = s._pData; ++GetRef(); } return *this; } ~String() { if (--GetRef() == 0) { delete[](_pData - 4); } } private: int& GetRef() { return (*((int*)(_pData - 4))); } private: char*_pData; }; 測試引用計數和深拷貝所用時間 class Time { public: Time() { begin = GetTickCount(); } ~Time() { int end = GetTickCount(); cout << "end - begin = " << end - begin << endl; } private: int begin; }; void FunTest() { Time t; COW::String s1("12345");//引用計數 COW::String s2(s1); for (int iIdx = 0; iIdx < 1000000; ++iIdx) { s1 = s2; } } void FunTest2() { Time t; String s1("123456789"); String s2("2345678"); for (int iIdx = 0; iIdx < 1000000; ++iIdx) { s1 = s2; } } int main() { FunTest(); FunTest2(); system("pause"); return 0; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。