shellmad 16 C 新特性 寫時拷貝

2021-10-21 17:55:09 字數 3638 閱讀 2951

上節課引用技術遺留了兩個問題

當我們資源進行修改, 所有引用該物件的資源都會被修改.

解決該問題的思路:寫時拷貝(copy on write) : 在寫的時候, 對資源進行重新拷貝乙份, 當某個資源要進行修改的時候, 我們c++檢測到這種修改, 然後會對這個資源進行一次拷貝, 接下來你的修改與原資源沒有關係了, 因為你改變的是拷貝的值, 所以如果這麼做, 能夠解決上述問題

但是如果這麼做, 要對引用技術進行相應的加減, 新的資源, 要有新的引用計數器, 要新產生,並且變為1; 原始的資源的引用計數要-1, 所以要涉及到兩個事情

1.1. 資源的拷貝

1.2. 引用計數器的加減

分析**:

//#include

"stdafx.h"

#include

#include

struct refvalue

;refvalue::

refvalue

(const

char

* pszname)

refvalue::

~refvalue()

}void refvalue::

addref()

void refvalue::

release()

}class

cstudent

}private

: refvalue* m_pvalue;};

void cstudent::

setname

(const

char

* pszname)

cstudent::

cstudent

(const

char

* pszname)

cstudent::

cstudent

(cstudent& obj)

cstudent::

~cstudent()

cstudent& cstudent::

operator

=(cstudent& obj)

m_pvalue-

>

release()

; m_pvalue = obj.m_pvalue;

m_pvalue-

>

addref()

;return

*this;}

void cstudent::

release()

intmain

(int argc,

char

* ar**)

還是一樣的道理, 建立乙個計數器物件struct refvalue

然後資源和計數器繫結

struct refvalue
計數器是普通的變數int, 因為refvalue是指標

接著計數器建立物件, 計數器賦值為1

refvalue::

refvalue

(const

char

* pszname)

釋放的時候釋放掉

refvalue::

~refvalue()

}

該+1的+1

該釋放的釋放

void refvalue::

addref()

void refvalue::

release()

}

與上一次**唯一改變的地方 =運算子的過載cstudent& operator=(cstudent& obj);以及拷貝構造cstudent(cstudent& obj);當進行拷貝構造的時候, 用的是淺拷貝, 並且資源計數器+1

cstudent::

cstudent

(cstudent& obj)

當進行=運算子過載的時候, 依然是淺拷貝, 資源計數器 + 1

cstudent& cstudent::

operator

=(cstudent& obj)

m_pvalue-

>

release()

; m_pvalue = obj.m_pvalue;

m_pvalue-

>

addref()

;return

*this

;}

但是在修改資源的時候void setname(const char* pszname);會對原來的計數器進行釋放m_pvalue->release();

void refvalue::

release()

}

然後就會建立新的計數器, 賦給當前的物件m_pvalue = new refvalue(pszname);核心**

void cstudent::

setname

(const

char

* pszname)

執行**:

此時stu2stu3同時在使用「li si」這個資源, 所以引用計數為2次, 兩者的m_pszname是一模一樣的

如果呼叫setname, 會對其中乙個資源(m_pszname)進行修改

要修改資源了, 對原有資源的引用計數器進行釋放操作

進行原有資源釋放操作, 需要判斷原有資源引用計數

新建立乙個物件(**中"li si2") 的引用計數器賦給當前引用計數器

計數器變為1

最後的結果

本來兩者擁有的是同一種資源, 但是其中某乙個資源得到了修改, 就會重新申請乙份資源, 對新申請的資源進行修改, 就是寫時拷貝操作

react16的新特性

react 16 的好處 1 新的核心演算法 fiber react 新的演算法,更加友好 2 render可以return陣列 字串 可以return陣列 不需要包div 但是必須有對應的key 3 錯誤處理機制 增加了拋異常的生命週期函式 componentdidcatch err,info 這...

C 函式新特性

1.函式的預設引數 函式可以有預設引數,你在呼叫的時候,如果不給函式引數賦值,函式將按照預設值執行 2.過載函式 函式可以過載,也就是函式名稱可以一樣,只是返回型別以及引數型別,數目不同。函式被呼叫的時候,系統會根據引數來匹配到相應的函式。3.內聯函式 申明時候加上inline,省去了函式傳遞的過程...

從C 2 0新特性到C 3 5新特性

一 c 2.0 新特性 1 泛型 listobj list new list obj list.add new myobject 2 部分類 partial namespace set 或在另乙個檔案中 public partial class class1 3 靜態類 public static ...