為什麼 C++ 11 標準不加入 GC 功能呢?
現在這個年代,使用C++的話,提供一個GC的功能難道不好嗎?比如Objective-C for mac,就有在最新版本里就加入了垃圾回收功能
GC與C++基因不合,RAII已經基本上算極致了
用C++好不容易有自己管理內存的快感,還要被題主剝奪。真是沒有人性啊!一定是體制問題!
你還真不能說C++拒絕GC,事實情況是,有那麼多種GC演算法,你說加哪種好呢?顯見C++標準委員會的人都有選擇恐懼症,最後他們基本達成的協議是這麼一些東西:
declare_reachable
undeclare_reachable
declare_no_pointers
undeclare_no_pointers
pointer_safety
get_pointer_safety
美其名曰「Minimal support for garbage collection」。
不過因為太minimal了,都minimal到沒用了,所以木有哪個編譯器願意去做,大家都把這些東西直接實現成no-op,你說反正又沒人用花那麼大力氣去實現它是為神馬?GC不是免費午餐,運行要花資源的同學。如果CPP有GC肯定哭聲一片問怎麼關掉~
加入GC不是不可以,但是由於C++的原則,不可能為了GC而去掉手動管理內存或者RAII管理內存的方式,再加上C++程序員的特點,很可能同一個項目里混合各種帶GC的部分和不帶GC得部分,而且加入GC免不了要對支持GC的類加入一些附加信息,還是由於C++的原則,不可能固定為每個類都加入支持GC的信息,那假如你拿到一個庫,裡面有個類,搞的你都不知道該delete還是該放那裡不管.....
總得來說,即使有GC,我猜也絕不會達到java,python之類"幾乎完全不用考慮內存"的高度.
不過我覺得以上其實都不是真正的問題,技術上怎麼都能實現,語法什麼的也不是不能改,主要原因我猜還是現在加入GC依然不是一個好的時機,目前C++的內存管理手段將將夠用,還沒到不加就不行了的時候....看看C++17會怎麼樣吧C++11 里完善了 move 語義,於是 RAII 便成為比 GC 更一致而高效的資源管理方案。於是為什麼還需要 GC ? 有了 std::shared_ptr/std::weak_ptr,std::unique_ptr 之後的 C++ 真的不需要去擔憂泄漏了。
又到了搬運的時候了。
-----------------------C++之父寫的《C++語言的設計和演化》gc不受控制,在做高要求的service時,系統的gc會嚴重影響到系統運行,造成毛刺。至少在分散式存儲領域,連微軟的storage都有部分是從c#改到c++。
C++11要向下兼容到C89。一個自定義的指針就能擊破整個GC體制,GC和內聯彙編更存在不可調和的衝突
C++有GC的提案,反正沒通過。基本上就是,如果你要加入GC,你就得詳細標註你的每一個類型到底要用到什麼程度的GC,然後類型和類型之間的關係就變得更複雜了,譬如說一個要GC的類放進一個不要GC的類要怎麼清算之類的事情。之所以要這樣,是因為C++允許你自己操作內存。綜上所述,這麼一個方案出來,你不會想用的。
歷史包袱:暴露了 raw pointer,class 又沒有 single root。沒有地方讓 GC 能全面 take over control。
C++有一個比較著名的垃圾回收庫--Boehm. 不過這個庫在使用的時候有很多限制,可移植性也不好。 Boehm的作者Hans-J. Boehm和Symantec 的Mike Spertus曾經在07年向C++委員會提交了垃圾回收的提案(N2670: Minimal Support for Garbage Collection and Reachability-Based Leak Detection (revised)),該提案剛開始得到了得到了很多委員成員的支持,後來在標準里刪除了,原因是過於複雜。雖然如此,但是仍然有一些編譯器支持它,比如微軟的VS2010~2013.Support For C++11 Features (Modern C++)
因為C++有析構函數,所以自然就支持ARC,所以GC沒什麼用
智能指針我都看不順眼,視為異端。gc?題主在搞笑嗎?
用C++不就是享受自己能夠對內存有絕對的控制權么?
不然用C#/Java開發效率高多了, 甚至C#的執行效率和C++都有的一拼
為什麼c沒有gc 為什麼彙編沒有gc
https://www.simple-talk.com/opinion/geek-of-the-week/bjarne-strostrup,-and-programmers-with-class/
考慮到C++內存管理的複雜性,現在最現實的方式有:
1. 忽略類型等一系列問題,只依照二進位數據做保守收集;
2. 由GC使用方顯式指定對象之間的關聯性,配合虛析構使用;3. 智能指針加上循環引用檢測。等。然後發現都能用庫實現,也沒有哪個有絕對的壓倒性優勢。於是標準委員會說,你們想用就自己折騰吧,然後洗洗睡了個人看法
gc和c艹基因不合都不是問題
因為可以加上可選gc的功能
真正的問題是不需要gc
有RAII了啊
推薦閱讀:
※c++11標準 GC(垃圾回收)是否會使老代碼產生未定義行為?
※一個人基於OpenJDK實現GC的concurrent compact部分,以減少GC停頓,困難嗎?
※JVM堆內存很富足時,為什麼經常連續發生兩次full GC?
※CMS GC發生concurrent mode failure時,為什麼使用單線程的full GC?
※JVM full GC的奇怪現象,求解惑?
TAG:C | CC | GC垃圾回收計算機科學 |