既然引用計數在做 GC 時有效能問題,為什麼智慧型指標會廣泛應用它?

時間 2021-06-08 06:54:42

1樓:喬捷

因為C++實現不了GC,只能用RC。RC的主要缺點也不是什麼效能問題,效能並不比GC差,主要的問題是不能解決迴圈引用的問題。

2樓:

從程式優化角度看,越上層掌握的資訊越多,所能做的優化越多,越有針對性。智慧型指標是乙個交付使用者的工具,因此可以把優化做到恰到好處。而放入到GC這麼乙個底層自然就失去了很多優化的可能。

並且從整個程式的優化角度看,任何GC也不可能比使用者掌控做的更好,哪怕僅僅是用引用計數這麼簡單的機制。

如果是大量反覆分配和釋放記憶體的程式並且具有無窮大的記憶體,那麼GC大概率具有吞吐量上的優勢,但現實程式並不一定如此設計以及並不存在這樣的理想系統,必須考慮其他的因素。可以說目前採用GC的執行時實際上表現都很差。

3樓:DuaiHan1020

智慧型指標不是GC,智慧型指標是一種設計模式(引用計數),GC是一種設計模式(可以是引用計數,也可以是別的)加上一套對它的管理系統。

所以單純的引用計數無法解決迴圈引用的問題(不要說weak_ptr,那只不過是設計優化或者說workaround,並不是根本解決這問題),單純引用計數也不具備資源延遲釋放等靈活管理的帶來的特性。

智慧型指標確實有更多開銷,不過他帶來的設計優化優勢相比這點開銷來說是值得的。

而且,智慧型指標也是需要時才用(廢話,所有特性都是如此),根據設計需求確定,這個需求是:

需要明確資源所有權

raii。防洩露,和異常安全。

當然還有個大前提是:這個場合需要使用指標。

4樓:小島上的做題家

因為cpp在大多數情況下是可以用reference解決的,不需要涉及智慧型指標,涉及指標也不一定涉及shared pointer,用shared ptr也可能只是copy一遍而已。而且引用計數不等於全域性GC。

而你別的語言是每乙個變數都涉及引用計數,還有全域性GC。如果你用cpp但程式裡所有的變數都用shared ptr那也是災難...

不過如今幾乎所有程式的瓶頸都在I/O上,就算你全用shared ptr,我覺得只要你的I/O在10+ milliseconds級別,可能整體效能上也看不出太大差別...

甚至可以這麼說,只要你所有I/O的下游都扛得住,錢夠,Python都是可以horizontally scale到cpp的吞吐量的。這個時代那些個位數microseconds級別的的優化,在milliseconds級別的I/O面前都是沒有意義的。並不是說不做這些優化,而是為這種級別的優化做出一些犧牲是不值得的。

5樓:Jason5Lee

因為智慧型指標還有 unique_ptr,而且 C++ 允許不安全的記憶體管理。

如果要安全的話,真正快的是 Rust 這種有一萬種指標型別的語言。

6樓:靈劍

不存在矛盾,原因在於C++等語言中不是所有物件都有引用計數,只有需要的物件才有,其它的則不是通過引用計數來確定生命週期的。如果所有物件都加上引用計數,那也會有效能問題。而CPython這樣的所有物件都有引用計數,甚至連個迴圈變數都有引用計數,自然會有吞吐量的問題。

不光是只有很少的物件使用引用計數管理,而且通常也並不是所有使用的情況下都會AddRef和Release,因為程式設計師可以判斷很多臨時使用的情況下並不需要真的去增加Ref,所以實際上修改引用計數的情況也少;直譯器就不行,直譯器只能預設每次物件傳遞(比如函式呼叫)都有可能借走這個物件,所以基本上用一次就得Add/Release一遍,自然效能也變差了。

7樓:luikore

C++ 也老說為了效能要用 unique_ptr 不用 shared_ptr,也就是能避免引用計數就避免。其實乙個執行緒安全的 shared_ptr 好難寫對,寫對還要跑得快就更費勁了。

但快慢是相對的,看語境。少數人做基礎庫才考慮這個效能… Swift 這些是給大眾做應用的,寫應用誰管那麼多呀,程式能寫出來就歡天喜地了。

C 中既然引用就是起別名,有什麼存在的必要呢?

飛翔的荷蘭豬 引用的目的是用同乙個別名,去稱呼不同的人。而不是給同乙個人起不同的別名。比如int f int a 我們可以把所有int變數傳給f函式,而在f函式中,把這些變數統一稱為a。初學者理解,如有偏差,還請不吝賜教。 上說得很清楚,1,大體上相當於更安全的指標,所以推薦盡可能用 代替 2,作為...

既然美國大學生都用計算器做四則運算,那麼考試允許用軟體算微積分嗎?

BlueBridger 你學微積分是為了掌握微積分,而不是為了掌握用手機拍照微積分的技巧對嗎?如果考試能用這種方式考,那考的是什麼呢?p.s 我參加的過的很多美國理科考試都是可以自己記note帶進考場,一般大家都會把公式寫在上面,負責運算的還是自己的大腦啊。 fumer555 我上過的大學數學課裡需...