#define _CRT_SECURE_NO_WARNINGS #include創(chuàng)新互聯(lián)建站是一家專(zhuān)業(yè)提供鹿邑企業(yè)網(wǎng)站建設(shè),專(zhuān)注與成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為鹿邑眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。using namespace std; #include //深拷貝 class String { public: String(const char* pData) : _pData(new char[strlen(pData) + 1]) { strcpy(_pData, pData); } String(const String& s)//拷貝構(gòu)造,深拷貝,指針傳遞 : _pData(NULL) { String temp(s._pData); std::swap(_pData, temp._pData); } String& operator=(String s)//賦值運(yùn)算符重載,深拷貝,值傳遞 { std::swap(_pData, s._pData); return *this; } ~String() { if (NULL != _pData) { delete[] _pData; _pData = NULL; } } private: char* _pData; };//深拷貝 //引用計(jì)數(shù) 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)//共用同一段引用計(jì)數(shù) { ++(*_refCount); } // s1 = s2; String& operator=(String s) { if (this != &s) { if (--(*_refCount) == 0)//檢查這塊空間是否只有自己使用 { delete[] _pData; delete _refCount;//檢測(cè)完釋放歸還操作系統(tǒng) } _pData = s._pData;//再指向另一塊空間 _refCount = s._refCount; ++(*_refCount); } return *this; } ~String() { if (--(*_refCount) == 0) { delete[] _pData; delete _refCount; } } private: char* _pData; int* _refCount; }; } //優(yōu)化引用計(jì)數(shù) 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; }; 測(cè)試引用計(jì)數(shù)和深拷貝所用時(shí)間 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");//引用計(jì)數(shù) 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; }
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。