c++11標準 GC(垃圾回收)是否會使老代碼產生未定義行為?
01-05
這是一些關於GC標準的介紹……
http://www.stroustrup.com/C++11FAQ.html#gc-abi比如下面的簡單示例
int *p=new int;
++p;//然後沒有指針指向上一句new出來的int,按照c++11標準,編譯器可以生成代碼來回收那些內存
*--p=1024;//按照c++11標準,這是未定義行為
老的代碼可能以不安全的方式使用指針。在某些底層庫中,由於一些指針總是對齊4位元組或8位元組,它們的最低bit一定是0,那就可以拿來存儲一個bool類型,可以節省空間。
然而在c++11標準引入GC後,如果老的代碼沒有使用
std::declare_reachable(void*);
而默認一切內存不由代碼明確調用釋放便一直可訪問,代碼的可靠性如何?
(我該如何禁用這個特性?我不想每次new都declare_reachable,而且我不明確它可能以怎樣的原理實現,又會對效率造成什麼影響。)
那個東西叫minimal GC support,根本不是什麼GC,是用來實現GC的東西。
再說這玩意兒也沒人真的實現了啊,你愁什麼?
幾乎沒有編譯器實現了這個提案,放心
Proposal在這裡N2670: Minimal Support for Garbage Collection and Reachability-Based Leak Detection (revised) 。注意,這是Minimal Support for Garbage Collection,不是GC。這是為以後的GC鋪路的,定義一些行為未定義的情況,而不是真正實現了GC的功能。
而且,目前msvc/gcc/clang/icc都沒實現這個,你不用擔心。自己不管內存,那玩c++還有什麼意思
第一,沒有人實現了這個東西第二,你給的這段代碼,++p本身就是未定義行為(或者說依賴於實現)——C++只規定獲取對象、對象成員和數組元素的指針和數組尾後指針是合法的,p原來指的是對象int,++p之後得到的是對象後一個空間的地址,這個地方又不是數組尾後位置,所以不合法,B.S.可能沒注意到這一點
c++標準沒有規定GC,只是規定了GC的介面。如果你要使用GC,那就應該放棄老代碼,規避不安全的指針運算。
指針運算在BoehmGC里也是大概率玩脫,沒太大差別。允許細粒度控制是否使用GC(operator new (GC))倒是非常有趣的設計。我覺得這個標準恐怕永遠不會有人去實現。而且我相信正常心智的C++程序員不會喜歡自動GC,那跟指針的設計是衝突的,而且嚴格的內存管理和生命周期本來就是C++的精髓之一。而且標準下面貌似就有個可以關掉的介面,雖然應該是要關必須整個程序都關掉吧。
移動一下指針,這個最小垃圾回收的支持就失效了。如果真的在工程里用了這個,會讓工程變成垃圾吧。
不建議使用這種特性,智能指針挺好的,善用智能指針,事半功倍
誰說cpp有gc?
推薦閱讀:
※一個人基於OpenJDK實現GC的concurrent compact部分,以減少GC停頓,困難嗎?
※JVM堆內存很富足時,為什麼經常連續發生兩次full GC?
※CMS GC發生concurrent mode failure時,為什麼使用單線程的full GC?
※JVM full GC的奇怪現象,求解惑?
TAG:C | GC垃圾回收計算機科學 | C11 |