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