為什麼 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垃圾回收計算機科學 |