C Handle 控制代碼 part1

2021-07-16 02:01:03 字數 2895 閱讀 1688

本文是我學習c++沉思錄第6章的筆記

本文主要講述了handle類的概念,定義方法以及寫時複製技術。

在前文(surrogate**類)的講解中我們了解到了**的實現方法.

**類有很多好處,但是麻煩的是每次都得進行複製.如果該類是經常使用並且member很多的話,這樣複製的消耗是十分客觀的.

因此這裡就要介紹另外一種**類,handle,也就是控制代碼類.

為何使用控制代碼類?

首先就是複製問題.前面有談到,有些類內部資料很多,採用複製消耗非常大,這種情況下就必須採用控制代碼類來進行操作.

其次是由於函式的引數和返回值都是採用了複製進行自動傳遞.雖然c++中引用可以避免,但是很多情況下返回值採用引用並不明智.

對於採用指標的方式,可以解決問題,但是又會引入呼叫者對於動態管理記憶體的麻煩.而這往往是很多錯誤的根源.

何為控制代碼類呢?

控制代碼類可以理解為採用了引用計數的**類.

其多個控制代碼共享了同乙個被**的類.通過引用計數的方式來減少複製以及記憶體管理.

其行為類似指標,因此也有智慧型指標之稱,但其實差別很大.後面會有講述.

控制代碼類例子:

先有乙個簡單的類point

1

class point

2 5 point(int x,int y):_x(x),_y(y){}

6int x()const

7void x(int xv)

8int y()const

9void y(int yv)

10private:

11int _x;

12int _y;

13 };/*

}}}*/

接下來我們要定義其的handle類.

我們的handle類:

1

class

handle

2 5 handle(int x,int y):up(new upoint(x,y)){}

6 handle(const point&p):up(new upoint(p)){}

7 handle(const handle &h);

8 ~handle();

9 handle& operator=(const handle &h);

10int x() const

11int y() const

12 handle& x(int);

13 handle& y(int);

1415

16private:

17 upoint *up;

18void allocup();

19 };

這裡說明我們的handle和指標的不同之處.

也許有讀者會對handle有疑問,為什麼不採用operator->來直接操作point呢?

其實顧慮就是operator->返回的是point的位址.也就是使用者可以輕易的獲得point的位址進行操作,這並不是我們想要的.這也就是handle也pointer不想同的地方.

upoint是為了採用引用計數定義的資料結構

1

//all member is private..only assess by handle

2class upoint

3 10 upoint(const point&pv):p(pv){}

11 upoint(int x,int y):p(x,y),u(1){}

12 upoint(const upoint &up):p(up.p),u(1){}

13 };/*

}}}*/

對於handle類的操作,我們要在handle類進行複製的時候,累加handle指向的upoint的計數值

即複製建構函式以及賦值函式

1 handle::handle(const handle &h)

2 :up(h.up)3 6

7 handle& handle::operator=(const handle &h)

8

而對於析構函式,則是減小引用計數,如果減到0了,就說明沒有其他的handle指向了upoint,因此我們要刪除掉.

1 handle::~handle()

2

剩下的就是定義handle對於point的操作了.即handle::x(int xv)和handle::(int yv)了.

這裡有2種寫法.

一種是像指標一樣,對於賦值,就直接修改指向的point裡面的值.這種方法有乙個問題,即所以都指向這個point的handle類獲取的x值都會變化.

**:

1

//point like

2 handle& handle::x(int xv)3 7

//point like

8 handle& handle::y(int yv)

9

還有一種是寫時複製技術,即每次對於共享的point進行修改的時候都複製乙份新的point,然後進行修改.

這種技術在handle中大量採用.在stl中,string也採用了同樣的方法.

其額外開銷很小,而效率也不差.

**:

1

void handle::allocup()

2 8 }

910 handle& handle::x(int xv)

11 16

17 handle& handle::y(int yv)

18

至此,handle類的第一部分就講完了.

之後會有第二部分的講解.解決了多出了乙個upoint的麻煩.

C Handle 控制代碼 part1

本文是我學習c 沉思錄第6章的筆記 本文主要講述了handle類的概念,定義方法以及寫時複製技術。在前文 surrogate 類 的講解中我們了解到了 的實現方法.類有很多好處,但是麻煩的是每次都得進行複製.如果該類是經常使用並且member很多的話,這樣複製的消耗是十分客觀的.因此這裡就要介紹另外...

部落格推薦 Part 1

部落格推薦 part 1 博起 了一年多了,寫過一百多篇博文,看過的博文更是不計其數。剛剛看到乙個部落格的文章,實在把我笑到不行。然後就想推薦給大家。繼而就心血來潮,想把自己喜歡的一些部落格陸續的推薦給大家。也許,你也會喜歡呢?說明 仙仙,本名張仙!是湖南的一位autoware兄弟,跟我一起混跡內蒙...

目標檢測part1

1 1卷積 googlenet inception 可看作全連線 1 增加非線性 2 特徵降維 空洞卷積 在相同的感受野的情況下,使用空洞卷積得到更大的特徵圖,獲得更密集的資料,而更大的特徵圖有助於目標檢測和目標分割任務中對小物體的識別分割效果 轉置卷積 不是真正意義上的反卷積,是一種上取樣的方式,...