C++11読書ノート—7(メモリ管理)

2176 ワード

Javaのゴミ回収がうらやましいときは、javaのゴミ回収メカニズムがC++で実現されているとは思わなかったと思いますが、実はC++バージョンで実現されていました.
実はC++のメモリ割り当ての難点は回収すべきでない回収ではない.ポインタとは思えないポインタが簡単に認識できないものもあります.
一.ゴミ回収方式の概要
1.参照カウント法(Reference Counting Collector)
リファレンスカウント法は、ルートセットを使用しない唯一のゴミ回収法であり、リファレンスカウンタを使用して生存オブジェクトと使用しないオブジェクトを区別します.一般に、スタック内の各オブジェクトは参照カウンタに対応します.参照カウンタは、オブジェクトを作成して変数に割り当てるたびに1に設定されます.オブジェクトが任意の変数に割り当てられた場合、参照カウンタは1を加えるたびにオブジェクトが役割ドメインを出た後(そのオブジェクトが廃棄されて使用されなくなった)、参照カウンタは1を減らし、参照カウンタが0になると、オブジェクトはゴミ収集の条件を満たす.リファレンスカウンタベースのゴミ収集器は、プログラムの実行を長時間中断することなく、リアルタイムで実行しなければならないプログラムに適しています.しかし、問題も発生し、リングリファレンスという問題がある.出費も少なくないが、実際には一定の制限がある.
これはshared_に似ていますptrの原理.
2.トレース処理によるゴミ回収
(1)タグ-クリア
≪タグ・ステージ|Tag Stage|oem_src≫:現在アクティブなオブジェクトがルートであり、ルートから参照可能なヒープ領域を検索し、タグを付けます.
クリアフェーズ:マークされていないクリアされます.
特徴:必ず大量の破片が発生します.△これによって、タグの整理が生まれた.
(2)タグ-整理
タグフェーズ:上と同じ
整理段階:生きている対象を前に揃える.
特徴:これにより大量の破片が解決され、システムのオーバーヘッドがやや大きい
(3)タグ-copy
まずメモリをfrom領域とto領域に分けます.システムがfromから割り当てられ、fromがいっぱいになるとfromが回収されます.生きたcopyをto空間(to領域がコンパクトになった)にします.fromはゴミだらけです.from,toキャラクター交換下. 
特徴:スタックの利用率は半分しかなく、
二.C++11とゴミ回収
C++ポインタの問題で、ゴミ回収が複雑で、現在指向されている空間があるかどうか、ポインタ操作で指向されているかどうか分かりません.C++11従って最小ゴミ回収サポート
1.最小ゴミ回収サポート
C++11は、安全なポインタを定義しています.C++11用語を安全派生と呼ぶ.セキュア派生ポインタは、newが割り当てられたオブジェクトまたはそのサブオブジェクトを指すポインタです.安全に派生するポインタ操作は次のとおりです.
1.解引用に基づく引用、&*p
2.p+1のような明確なポインタ操作を定義する
3.static_のような明確なポインタ変換を定義するcast(p)
4.ポインタと整形の間のreinterpret_cast(p)
次の手順に従います.
	int *p = new int(10);
	int *q = (int*)(reinterpret_cast(p) ^ 2016);
	q = (int*)(reinterpret_cast(q) ^ 2016);

メモリ回収メカニズムを使用すると、*qを再使用すると、セキュリティ操作ではないため問題が発生します.しかし、今日、2016.8.4では、C++11コンパイラのサポートはありません.これは、以前の多くのコードに転覆的な結果をもたらすため、これは難しいと思います.
ごみの回収を通知すると、メモリを回収できません.declareを使うことができますreachable();関数#カンスウ#
	int *p = new int(10);
	declare_reachable(p);
	int *q = (int*)(reinterpret_cast(p) ^ 2016);
	q = (int*)(reinterpret_cast(q) ^ 2016);

2.C++11ゴミ回収のヒント
C++11のごみ回収はnewのメモリに限られており,現在は実現していないが互換性のためにできるだけそうしなければならない.
説明:ごみ回収とdeleteは衝突しません