引用计数
最近在看《提高c++性能的編程技術(shù)》一書,第十二章提到引用計數(shù),要開始學(xué)習(xí)新知識了~
學(xué)習(xí)之前先抄錄書中一段精彩的言論(P177)
--------------------------------------------------------
類似于自然界,熵的原理亦可用于軟件工程之中--所有實體都會隨著時間的消逝而消失。一個軟件項目最初可能源起于某個設(shè)計清晰、實現(xiàn)簡單的小型原型系統(tǒng)。只包含基本功能的原型系統(tǒng),要使它們滿足上市需求,往往都要經(jīng)歷急速擴展的過程。這通常是為了滿足客戶對于新功能(有時是難解的)的突發(fā)性需求以及對原有瑕疵的改進(jìn)需要。新功能的開發(fā)加上舊錯誤的修補會對原先清晰明了的設(shè)計造成重大破壞。隨著時間的推移,設(shè)計和實現(xiàn)的清晰性也會隨著代碼維護(hù)及頻繁的發(fā)布周期而不復(fù)存在,軟件不可避免的變得紊亂不堪,區(qū)分軟件好壞的唯一標(biāo)準(zhǔn)就是衰退率。
-----------------------------------------------
以下內(nèi)容轉(zhuǎn)載自
http://blog.sina.com.cn/s/blog_7708265a01010pb5.html
?
引用計數(shù)是對共享的動態(tài)內(nèi)存的一種管理方法,STL庫的string就是用到了引用計數(shù)的方法。
1. 概念
引用計數(shù)用來記錄當(dāng)前有多少指針指向同一塊動態(tài)分配的內(nèi)存。當(dāng)有指針指向這塊內(nèi)存時,計數(shù)器加1;當(dāng)指向此內(nèi)存的指針銷毀時,計數(shù)器減1。當(dāng)引用計數(shù)為0時,表示此塊內(nèi)存沒有被任何指針指向,此塊被共享的動態(tài)內(nèi)存才能被釋放。
?
2. STL庫的string利用引用計數(shù)共享內(nèi)存
#include <stdio.h> #include <string>using namespace std;int main() {string str1("aaa");printf("the address of str1 is: %x\n",str1.c_str());string str2("bbb");printf("the address of str2 is: %x\n",str2.c_str());string str3("aaa");printf("the address of str3 is: %x\n",str3.c_str());string str4 = str1;printf("the address of str4 is: %x\n",str4.c_str());str1 = str2;printf("the address of str1 is: %x\n",str1.c_str());str2[2] = 'a';printf("the address of str2 is: %x\n",str2.c_str()); }結(jié)果如下:
the address of str1 is: 1816028
the address of str2 is: 1816058
the address of str3 is: 1816088 ? ?//str3和str1并不共享一塊內(nèi)存 ? ?
the address of str4 is: 1816028 ? ?//str4和str1共享一塊內(nèi)存,所以初始化(string(const char*))和賦值(operator=(const string&))是不一樣的
the address of str1 is: 1816058 ? ?//str1和str2共享一塊內(nèi)存
the address of str2 is: 18160b8 ? ?//寫str2,因為引用計數(shù)的關(guān)系,要分配新的內(nèi)存給str2
?
STL string共享內(nèi)存的原則(copy on write):
利用初始化或賦值生成多個內(nèi)容相同的string,當(dāng)沒有對這些string進(jìn)行寫操作時,它們會共享同一塊內(nèi)存。當(dāng)有寫操作出現(xiàn)時,才會有新的內(nèi)存重新分配。
?
3. 利用引用計數(shù)實現(xiàn)簡易String
問題:我們對String類的內(nèi)存進(jìn)行計數(shù),但引用計數(shù)這個變量是類的什么類型的成員變量?
解答:
1) 普通私有成員變量,每個類都有一個獨立的計數(shù)器變量,在新的類對象拷貝構(gòu)造和賦值的時候需要進(jìn)入原來的類對象中去獲取這個計數(shù)器,再進(jìn)行修改,在同一個類對象之間缺乏通用性。
2) static變量,類的所有對象公用一個計數(shù)器變量。字符串”aaaa”和”bbbb”使用不同的內(nèi)存,它們應(yīng)該分別有對應(yīng)自己內(nèi)存的計數(shù)器變量。
3) 結(jié)論,對每一塊內(nèi)存分配一個變量,可以在動態(tài)分配字符串內(nèi)存是多分配一個字節(jié),將計數(shù)器的值放在第一個字節(jié)中;也可以在動態(tài)分配內(nèi)存前先動態(tài)分配一個int型的內(nèi)存來存放這個計數(shù)器。
?
----------------------------------
在《More Effective C++》的Item 29中有關(guān)于引用計數(shù)的實現(xiàn),可供參考
?
轉(zhuǎn)載于:https://www.cnblogs.com/yangtze736-2013-3-6/p/3633397.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
- 上一篇: 最原创的验证码产生过程,桃花朵朵开
- 下一篇: Materialized Views