日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ reference counting引用计数原理

發布時間:2024/4/11 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ reference counting引用计数原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?我們都知道,c++最令人頭疼的問題也是被其他語言鄙視的問題——指針管理。而引用技術能夠讓上面的簡化了不少。下面說說c++引用計數的設計原理。

? ? ? ? 引用計數的兩個動機:

? ? ? ? ? ? ? ? 1. 簡化heap對象周邊的記錄工作。對于分配在heap中得內存,如果沒有顯式delete它,那么就會常駐在內存區間,引起內存浪費。而且在heap對象的所有權會隨著復制和賦值出現轉移,所以編譯器還需要記錄對象的所有者是誰,這絕對是件吃力不討好的事情。有了引用計數,對象使用該技術,對象便擁有它自己。一旦不再有任何人使用它,它便自動銷毀。這種技術最終構建出了垃圾回收機制(多說一句,這種技術在游戲開發過程中一天都沒有用)。

? ? ? ? ? ? ? ? ?2.引用計數的最重要功能是對象共享。當有許多對象有相同的值時,將該值存儲多次是一件愚蠢的事。因此讓所有等值對象共享一份實值即可滿足要求,這樣既節省內存空間,也讓速度加快(構造、析構對象費時)。

? ? ? ? ?雖然引用技術能夠帶來足夠的便利,但它也會產生一些令人難過的影響。舉個例子吧!

? ? ? ? ?假如有3個對象共享一個實值對象,即a、b、c都指向“hello ,world”字符串?,F在我們想要修改a的值,注意這里只是需要修改a的值,而b、c的值不變,這時引用計數會讓你無所適從。一改都改,不改也不能達到目的。怎么辦?

? ? ? ? ?我們需要追蹤引用計數的對象有多少個對象共享它。如果有一個共享對象修改做出修改時,我們不能改變引用計數對象,因為還有其他共享對象需要它。這是引用計數的數值開始派上用場了。這也是引用計數不得不添加的開銷。亦即我們需要存儲所共享的對象,也需要保存該對象的引用次數,兩者是一個耦合關系。

? ? ? ? ? 引用技術的實現方式是采用一個數據結構,其中含有引用次數和實際的數據對象。該數據結構將“某特定對象”以及“共享該對象的對象個數”關聯起來。但是引用計數有一個例外:分開構造,但擁有相同初值的對象,不會共享該數據結構,因此各自的引用計數沒有關系。例如:

? ? ? ? ? string s1("hello world");

? ? ? ? ? string ?s2("hello world");

? ? ? ? ? s1和s2有著相同的string初值,由于其是分開構造,所以不會共享數據結構,即其引用計數都為1.而下面的代碼:

? ? ? ? ? string s1("hello world");

? ? ? ? ? string s2 = s1;

? ? ? ? ? ?如果將s2賦值s1,那么兩者的構造過程一致,此時共享數據結構,那么s2賦值會導致引用計數+1。

? ? ? ? ? ?當然我們也可以實現只要是指向相同的對象就使用引用計數技術,即僅僅在“面對真正獨一無二的字符串時”才產生新的對象,否則都共享原有的對象。不過這樣子代價太大,一般不提倡。

總結

以上是生活随笔為你收集整理的c++ reference counting引用计数原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。