Jangan Takut Reaper



D, seperti banyak bahasa yang digunakan saat ini, dilengkapi dengan Garbage Collector (GC). Banyak jenis perangkat lunak dapat dikembangkan tanpa memikirkan GC sama sekali, mengambil keuntungan penuh dari keuntungannya. Namun, GC memiliki kekurangan dan pengumpulan sampah tidak diinginkan dalam beberapa skenario. Untuk kasus seperti itu, bahasa ini memungkinkan Anda untuk menonaktifkan pengumpul sampah untuk sementara waktu atau bahkan melakukannya tanpa itu.



Untuk mendapatkan hasil maksimal dari pengumpul sampah dan meminimalkan kekurangannya, Anda harus memiliki pemahaman yang baik tentang bagaimana GC bekerja dalam bahasa D. Tempat yang baik untuk memulai adalah halaman Pengumpulan Sampah di dlang.org , yang menyediakan alasan untuk GC dalam D dan menyediakan beberapa alasan. tips tentang cara bekerja dengannya. Ini adalah yang pertama dari serangkaian artikel yang membahas topik ini secara lebih rinci.



Kali ini kami hanya akan menyentuh dasar-dasarnya, dengan fokus pada fungsi bahasa yang dapat menyebabkan alokasi memori melalui GC. Artikel mendatang akan menyajikan cara untuk menonaktifkan GC jika perlu, serta idiom untuk membantu menangani non-determinisme (misalnya, manajemen sumber daya dalam penghancur objek yang dikendalikan oleh GC).



Hal pertama yang harus dipahami adalah bahwa pengumpul sampah D hanya dipicu selama alokasi memori dan hanya jika tidak ada memori untuk dialokasikan. Dia tidak duduk di latar belakang, memindai tumpukan dan mengumpulkan sampah secara berkala. Ini harus dipahami untuk menulis kode yang secara efektif menggunakan memori di bawah kendali GC. Perhatikan contoh berikut:



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


Program ini menciptakan array dinamis dari nilai tipe int, dan kemudian menggunakan operator gabungan di D untuk menambahkan angka dari 0 hingga 99 ke dalamnya foreach. Yang tidak jelas bagi mata yang tidak terlatih adalah bahwa operator gabungan mengalokasikan memori untuk nilai tambah melalui pengumpul sampah.



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 (, , ,  β€” - ).



Sekarang setelah kami mengetahui dasar-dasar bekerja dengan GC, pada artikel berikutnya dalam seri ini kita akan melihat alat mana dalam bahasa dan kompiler yang akan memungkinkan kami untuk menonaktifkan pengumpul sampah dan memastikan bahwa tempat-tempat penting dalam program tidak mengakses GC.



Terima kasih kepada Guillaume Piolat dan Steve Schweihoffer atas bantuan mereka dalam mempersiapkan artikel ini.




All Articles