剛看到一篇文章《標準c++類std::string的
記憶體共享和copy-on-write技術
》,覺得很有意思,於是將個人的理解記錄於此。
1.copy-on-write技術
copy-on-write技術使用了「引用計數」。當第乙個類構造時,string
的建構函式會根據傳入的引數從堆上分配記憶體,當有其它類需要這塊記憶體時,這個計數為自動累加,當有類析構時,這個計數會減一,直到最後乙個類析構時,此時的
引用計數為1
或是0,此時,程式才會真正的
free
這塊從堆上分配的記憶體。
所以,引用計數就是string
類中寫時才拷貝的原理。
由於string
類的記憶體是在堆上動態分配的,所以既然共享記憶體的各個類指向的是同乙個記憶體區,我們為什麼不在這塊區上多分配一點空間來存放這個引用計數呢?這樣一來,所有共享一塊記憶體區的類都有同樣的乙個引用計數,而這個變數的位址既然是在共享區上的,那麼所有共享這塊記憶體的類都可以訪問到,也就知道這塊記憶體的引用者有多少了。
於是,有了這樣乙個機制,每當我們為
string
分配記憶體時,我們總是要多分配乙個空間用來存放這個引用計數的值,只要發生拷貝構造可是賦值時,這個記憶體的值就會加一。而在內容修改時,
string
類為檢視這個引用計數是否為
0,如果不為零,表示有人在共享這塊記憶體,那麼自己需要先做乙份拷貝,然後把引用計數減去一,再把資料拷貝過來。
2.記憶體共享
在string類中,記憶體共享就是指多個string物件使用同一塊記憶體,直到某乙個string物件的內容發生改變時才為其分配記憶體。
3.這個兩種技術的乙個簡單實現
下面是我實現的乙個非常簡單的string類mystring:
該類僅實現了:
a. mystring str1("good");//定義乙個string物件
mystring str2;
b. mystring str3(str1);//拷貝構造
c. mystring str4;
str4 = str3;//物件賦值操作符
d. str4[0] = ''w;//操作符
e. str4.my_c_str();//獲取c串
f. str4.my_size();//獲取其大小
mystring.h
mystring.cpp
4. 測試**如下:
共享記憶體和訊號
1 共享記憶體概述 共享記憶體允許兩個或更多程序共享一給定的儲存區。因為資料不需要在各個程序之間複製,所以這是最快的一種程序間通訊方式。使用共享記憶體時的關鍵點在於如何在多個程序之間對一給定的儲存區進行同步訪問。例如若乙個程序正在將資料放入共享記憶體區,則在它做完這一操作之前,其他程序不應該去取這些...
資料共享,記憶體對映檔案和虛擬記憶體,共享記憶體
記憶體對映檔案允許開發人員預定一塊位址空間區域並給區域調撥物理儲存器。記憶體對映檔案的物理儲存器來自磁碟已有的檔案,而不是來自系統的頁交換檔案。一旦把檔案對映到位址空間,就可以對它進行訪問,就好像整個檔案都已經被載入記憶體一樣。不必再對檔案執行i o操作。使用記憶體對映檔案來顛倒檔案內容時,先開啟檔...
共享記憶體對映和占用記憶體關係
demo測試 對映檔案1g 1 對映1次,1寫,進行memset操作,共享記憶體佔1g 2 對映2次,1寫,1讀,單執行緒 1 1寫,進行memset操作,讀無操作,共享記憶體佔1g 2 1寫,進行memset操作,讀某個指定位置字元 len 2或len 1位置 共享記憶體佔1g 3 1寫,進行me...