Reference counting
前幾天有人在板上問了個有關C++ class內部member的記憶體管理問題,我那時後就寫了一小段Code來玩玩,所以順便丟上來XD
Reference counting是一種物件對內內部記憶體管理的方式。主要的原理是:
假設現在我有一個Class RefObj內部有一個char*的member用來存字串,那今天我把一個物件assign給另一個
因為這個動做會呼叫Copy constructor,傳統內部實做的方式就是先動態分配一段新的記憶體再把內容複製過去,不過如果這個字串很大的話,複製一次不僅費時又耗記憶體,而且複製後可能B就不會再被變更了。Reference counting的方法就是在物件內部維護一個Reference count,像今天B = A,那A的Reference count就+1。可是在B = A的過程中並不重新分配char*的記憶體,而是直接指向A中的char*記憶體位址。接著如果B被重新assign成別得值後,A的Reference count就-1。當物件在被銷毀的時候,只有Reference count=0的時候才會真正free那塊記憶體,因為Reference count!=0代表還有其他物件指向這段記憶體。
那你可能會問,如果在B = A後,我去修改B的內容,那A的內容不就也跟著被改了?所以這時候我們就用一個叫做Copy-on-write的技巧,只有B要被改變時我才重新分配新的記憶體給他,所以這樣就不會動到A的內容了。
這裡只是大約解說一下概念,我可能還不是說得很清楚,詳細可以看我寫的這段code: RefObj.cpp
Reference counting是一種物件對內內部記憶體管理的方式。主要的原理是:
假設現在我有一個Class RefObj內部有一個char*的member用來存字串,那今天我把一個物件assign給另一個
RefObj A("testing");
RefObj B = A;
RefObj B = A;
因為這個動做會呼叫Copy constructor,傳統內部實做的方式就是先動態分配一段新的記憶體再把內容複製過去,不過如果這個字串很大的話,複製一次不僅費時又耗記憶體,而且複製後可能B就不會再被變更了。Reference counting的方法就是在物件內部維護一個Reference count,像今天B = A,那A的Reference count就+1。可是在B = A的過程中並不重新分配char*的記憶體,而是直接指向A中的char*記憶體位址。接著如果B被重新assign成別得值後,A的Reference count就-1。當物件在被銷毀的時候,只有Reference count=0的時候才會真正free那塊記憶體,因為Reference count!=0代表還有其他物件指向這段記憶體。
那你可能會問,如果在B = A後,我去修改B的內容,那A的內容不就也跟著被改了?所以這時候我們就用一個叫做Copy-on-write的技巧,只有B要被改變時我才重新分配新的記憶體給他,所以這樣就不會動到A的內容了。
這裡只是大約解說一下概念,我可能還不是說得很清楚,詳細可以看我寫的這段code: RefObj.cpp
留言