copy-on-write是一種技術——去高效的完成「懶惰行為」。其核心思想就是:只有在需要分配記憶體的時候才會進行記憶體分配。這種思想廣泛的運用在作業系統和c++程式設計中。
在作業系統當中,當乙個程式執行結束時,作業系統並不會急著把其清除出記憶體,原因是有可能程式還會馬上再執行一次,而只有當記憶體不夠用了,才會把這些還駐留記憶體的程式清出。這樣既盡可能地減少了cpu讀取磁碟的次數,又可以保證功能的正確性。
在c++中copy-on-write技術被廣泛地應用於智慧型指標和字串類等地方。例如在qt的框架中,許多態別應用了該技術,qt的術語叫做隱式共享(」implicialy shared」), 通過compare-and-swap 操作增減內部參考計數器來完成操作。因為複製時相對廉價的,所以qt可以經常安全地使用多執行緒。
對於某些類而言,每一次都執行深拷貝會極大的降低執行效率,為了提高計算機執行效率
確保在需要進行深拷貝的時候(內容被改變的時候)執行深拷貝,確保程式的準確性
設定乙個計數器,標明引用的個數,當引用數量為0時,刪除該物件:
1. 在物件生命週期結束(呼叫析構函式)or需要寫入的時候,計數器減一
2. 在執行拷貝構造or賦值函式的時候,計數器加一
3. 在賦值函式中,輸入的左值將被重新賦值,所以需要將之前所指向的位址的計數器減一
乙個簡單的智慧型指標的實現
#include
using
namespace
std;
template
class cowptr;
ptr* ptr;
void detach();
public:
cowptr(const t* p =null);
cowptr(const cowptr& cp);
cowptr& operator=(const cowptr& cp);
unsigned
int getcount() const;
t* getpoint() const;
t& operator *();
t operator *() const;
t* operator ->();
const t* operator ->() const;
~cowptr();
};template
void cowptr::detach()
}template
cowptr::cowptr(const t* p)
template
cowptr::cowptr(const cowptr& cp)
template
cowptr& cowptr::operator=(const cowptr& cp)
ptr= cp.ptr;
ptr->counter++;
}return *this;
}template
unsigned
int cowptr::getcount() const
template
t* cowptr::getpoint() const
template
t& cowptr::operator *()
template
t cowptr::operator *() const
template
t* cowptr::operator ->()
template
const t* cowptr::operator ->() const
template
cowptr::~cowptr()
}class test
這個只實現了部分功能,每有乙個指標指向共享記憶體,計數器加一,計數器為0的時候釋放記憶體。但是沒有實現在寫的時候自動拷貝的功能 寫時拷貝技術
cow技術初窺 在linux程式中,fork 會產生乙個和父程序完全相同的子程序,但子程序在此後多會exec系統呼叫,出於效率考慮,linux中引入了 寫時複製 技術,也就是只有程序空間的各段的內容要發生變化時,才會將父程序的內容複製乙份給子程序。那麼子程序的物理空間沒有 怎麼去取指令執行exec系...
寫時拷貝技術
寫時拷貝故名思意 是在寫的時候 即改變字串的時候 才會真正的開闢空間拷貝 深拷貝 如果只是對資料的讀時,只會對資料進行淺拷貝 寫時拷貝技術是通過 引用計數 實現的,在分配空間的時候多分配4個位元組,用來記錄有多少個指標指向塊空間,當有新的指標指向這塊空間時,引用計數加一,當要釋放這塊空間時,引用計數...
寫時拷貝技術
寫時拷貝的主要思想是在複製原來實體的時候,如果複製後的實體不需要進行改變,那麼實際上沒必要進行實體內容的拷貝,只需建立乙個引用指向原來的物理記憶體,直接應用原來的實體內容即可,只有當需要對複製後的實體進行修改的時候才進行內容的拷貝。寫時拷貝技術在很多方面都有應用,典型的有 c 中的寫時拷貝技術 li...