C 中的寫時拷貝計數詳解

2021-10-03 14:59:07 字數 1537 閱讀 1587

**

寫時拷貝計數:

寫時拷貝從字面上來理解就是當你要寫入時才進行拷貝,也就是說你如果不進行寫操作就不會給你進行拷貝,其實寫時拷貝技術就是深淺拷貝和引用計數的應用,在不進行寫操作時做淺拷貝,在進行寫操作時就進行深拷貝,它就相當於是一種拖延的策略,不到最後不進行拷貝

就相當於是老師上課布置了幾個課後作業,但現在他的課已經講完了,所以讓你們上課的時候先寫一陣,然後明天交上來,這時候你是乙個學渣,你根本就不會寫,但是老師還沒有下課在教室裡轉,你很害怕老師過來時你什麼都沒有寫,所以你把你同桌寫的前幾個題拿了過來,放在你那裡(如果同桌要用也可以再拿過去),當老師過來看時,你拿你同桌的作業給他看就行了,這時候你同桌的作業就相當於是你的作業,不過第二天要交作業,你同桌的始終不是你的,所以這時候你沒有辦法了,你就把你同桌的作業一抄,然後後交了上去,這就是相當於是乙個寫時拷貝的應用,當你沒辦法的時候,也就是最後一刻的時候才進行拷貝,之前如果雙方都要用那個,且任何一方都不會進行修改,就將那一部分資料當做公共的資料,也就是只把位址拷貝過去,然後大家都可以用了,就不用多申請空間,節省了開銷,等到非用不可的時候再申請空間

深拷貝和淺拷貝:

深拷貝是說,當你複製我的時候,你也要在記憶體中申請這麼多的空間,然後我把我的東西再乙個乙個的複製給你,如果你不開闢空間,肯定就不能把我的東西拷貝給你,因為你都沒那麼多的地方來放我的東西,我又怎麼給你呢,所以當我們不想開闢那麼多空間卻想得到人家的東西時,就會使用淺拷貝,淺拷貝是指將人家那個空間的位址拿過來一看原來是這個,然後將自己指向那塊空間,這樣就只是將人家的位址拷貝給了自己,沒有動人家的內容,這時候我也可以用人家的東西,但因為淺拷貝是拷貝位址,所以當你改變裡面內容時,別人的內容也就改變了,所以深淺拷貝有各自適應的場景

引用計數:

引用計數是指我這裡有乙份資源,可能很多物件要用它,但都不想開闢空間把它拷貝過去,所以我就要做乙個資源的管理,因為每個物件都覺得這份資源是自己的,所以用完之後就想釋放它,但是不能這樣做,因為可能有其它物件還在使用它,所以我們就要想乙個策略,讓這個用完資源的物件在釋放空間時,不是真正的釋放,所以我們就有了引用計數,就是給這個資源計數,每當乙個物件要用它時,就給這個資源+1,表示有多少個物件在使用它,也可以理解為有多少份這樣的資源,在進行銷毀資源時,只需要給這個計數器減1就行了,當只剩下乙個資源,也就是計數為1時,才能真正的銷毀資源

再說寫時拷貝:

所以寫時拷貝就是我有乙個初始的物件,然後有其它的物件想要有乙個相同的資源,但如果進行深拷貝的話消耗太大,因為我這時只是使用這個資源,並不需要修改它,所以我就可以只進行淺拷貝,把位址拿過來,然後讓引用計數加1,當我需要修改資料時,這時我就不能再使用別人的資源了,因為我不能改變別人的資料,所以我必需把它的資源拷貝過來,然後再進行修改,當我拷貝過來後,相當於我有這份資源了,就不需要別人的了,所以初始物件的引用計數要減1,所以說寫時拷貝是乙個懶惰的行為,是一種拖延的方法,它適用於讀者多情況(也就是不對這個資源進行修改,只是讀取它),只需要大量寫的操作,就不推薦使用這個它,因為這樣並不會減少開銷,而會增加開銷,另外在使用寫時拷貝時,要注意執行緒安全的問題,因為如果乙個執行緒過來要使用這份資源,還沒有進行+1的操作,另乙個執行緒要釋放資源,發現計數為1,就把資源釋放了,而當前乙個執行緒過來時,資源已經被清理了,所以就會造成錯誤

C 引用計數寫時拷貝

寫時拷貝技術原理 寫時拷貝技術是通過 引用計數 實現的,在分配空間的時候多分配4個位元組,用來記錄有多少個指標指向塊空間,當有新的指標指向這塊空間時,引用計數加一,當要釋放這塊空間時,引用計數減一,直到引用計數減為0時才真的釋放掉這塊空間。當有的指標要改變這塊空間的值時,再為這個指標重新分配自己的空...

引用計數的寫時拷貝

首先我們需要知道什麼是寫時拷貝,通俗的說,就是寫的時候再拷貝。那到底什麼才是寫時拷貝呢?舉乙個很簡單的例子,就是建立乙個string類的物件,然後用這個物件再拷貝出多個物件,當然指標也會拷貝過去,造成多個物件指向同一塊空間,當對某個物件進行讀操作時,不會發生什麼問題,但當需要對某個物件進行寫操作時,...

c 寫時拷貝

在c 中乙個類有六個預設成員函式,其中拷貝建構函式分為淺拷貝和深拷貝 淺拷貝是一種值拷貝,深拷貝不僅是值拷貝,還要做其他處理 深淺拷貝的區別 由上圖可知當乙個拷貝構造乙個需動態開闢空間的物件時,用淺拷貝時會出現同一塊空間被釋放兩次,這樣顯然有問題,用深拷貝的話可以解決此問題,但當拷貝構造出來的物件,...