死神を恐れないで



Dは、現在使用されている多くの言語と同様に、ガベージコレクター(GC)が付属しています。多くの種類のソフトウェアは、その利点を最大限に活用して、GCについて考えることなく開発できます。ただし、GCには欠点があり、一部のシナリオではガベージコレクションが望ましくありません。このような場合、この言語を使用すると、ガベージコレクターを一時的に無効にしたり、まったく不要にしたりすることもできます。



ガベージコレクタのほとんどを取得し、その欠点を最小限に抑えるには、GCは、D言語でどのように機能するかを理解する必要があります。A良い開始点であるdlang.orgのガベージコレクションページ D言語でGCの理論的根拠をもたらし、いくつかを与えます、彼と一緒に働く方法のヒント。これは、トピックをより詳細に説明する一連の記事の最初のものです。



今回は、GCを介したメモリ割り当てを引き起こす可能性のある言語関数に焦点を当てて、ごく基本的な部分のみに触れます。今後の記事では、必要に応じてGCを無効にする方法と、その非決定性(たとえば、GCの制御下にあるオブジェクトのデストラクタでのリソース管理)に対処するためのイディオムを紹介する予定です。



最初に理解しておくべきこと:Dのガベージコレクターは、メモリが割り当てられた場合にのみ、割り当て可能なメモリがない場合にのみ開始されます。彼はバックグラウンドに座っておらず、定期的に山をスキャンしてゴミを収集しています。GC制御のメモリ効率の良いコードを書くためには、これを理解する必要があります。次の例について考えてみます。



void main() {
    int[] ints;
    foreach(i; 0..100) {
        ints ~= i;
    }
}


このプログラムは、型の値の動的配列を作成し、intDの結合演算子を使用して0から99までの数値を追加します foreach経験の浅い目には明らかではないことは、joinステートメントがガベージコレクターを通じて追加された値にメモリを割り当てることです。



D . , . , , . , , capacity. , , .



void main() {
    import std.stdio : writefln;
    int[] ints;
    size_t before, after;
    foreach(i; 0..100) {
        before = ints.capacity;
        ints ~= i;
        after = ints.capacity;
        if(before != after) {
            writefln("Before: %s After: %s",
                before, after);
        }
    }
}


DMD 2.073.2,  — GC. , GC . . , GC, .



, before after. : 0, 3, 7, 15, 31, 63, 127. ints 100 , 27 , , 255, . , , D, . , GC , (Steve Schveighoffer) .



, , GC . , , «» . GC .



, C C++, , . ,  — , . , GC D , . :



void main() {
    int[] ints = new int[](100);
    foreach(i; 0..100) {
        ints[i] = i;
    }
}


. , — . 100 . new 100, .



: reserve:



void main() {
    int[] ints;
    ints.reserve(100);
    foreach(i; 0..100) {
        ints ~= i;
    }
}


100 , ( length 0), . , 100 , , .



new reserve, , GC.malloc.



import core.memory;
void* intsPtr = GC.malloc(int.sizeof * 100);
auto ints = (cast(int*)intsPtr)[0 .. 100];


.



auto ints = [0, 1, 2];


, enum.



enum intsLiteral = [0, 1, 2];
auto ints1 = intsLiteral;
auto ints2 = intsLiteral;


enum .  — . , . ints1, ints2 , :



auto ints1 = [0, 1, 2];
auto ints2 = [0, 1, 2];


, . , ( D — ) — .



int[3] noAlloc1 = [0, 1, 2];
auto noAlloc2 = "No Allocation!";


:



auto a1 = [0, 1, 2];
auto a2 = [3, 4, 5];
auto a3 = a1 ~ a2;


D , , . : keys values, . , , - ,  — . , GC.



- , , , . , . , . D : byKey, byValue byKeyValue. , . , , . Ranges More Range (Ali Çehreli) Programming in D.



 — ,  — . , Garbage Collection — assert. , assert , AssertError, D, ( , GC).



, Phobos — D. - - Phobos’ GC, , . , Phobos GC. , , , , , . GC (, , ,  — - ).



これで、GCの操作の基本を理解できたので、このシリーズの次の記事では、ガベージコレクターを無効にして、プログラムの重要な領域がGCにアクセスしないようにするために、言語とコンパイラのどのツールを使用できるかを説明します。



この記事の準備を手伝ってくれたGuillaume PiolatとSteve Schweihofferに感謝します。




All Articles