不要害怕收割者



像今天使用的许多语言一样,D附带了垃圾收集器(GC)。充分利用其优势,可以完全不考虑GC地开发多种类型的软件。但是,GC有其缺陷,在某些情况下,垃圾回收是不可取的。对于这种情况,该语言允许您暂时禁用垃圾收集器,甚至完全不使用它。



为了获得最大的垃圾收集器,尽量减少它的缺点,你需要有一个良好的GC是如何工作d语言理解。一个良好的开始是在dlang.org垃圾收集页面,它提供了GC的理由在d,并提供了几个与他一起工作的技巧。这是更详细介绍该主题的系列文章中的第一篇。



这次,我们将只涉及最基本的内容,重点是可以通过GC导致内存分配的语言功能。将来的文章将介绍在必要时禁用GC的方法以及帮助解决其不确定性的惯用法(例如,由GC控制的对象析构函数中的资源管理)。



首先要了解的是,D的垃圾回收器仅在内存分配期间触发,并且仅当没有内存可分配时才触发。他没有坐在后台,而是定期扫描堆垛并收集垃圾。您需要了解这一点,才能编写G​​C控制的内存有效代码。考虑以下示例:



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


该程序将创建一个动态的类型值数组int,然后使用D中的join运算符在中将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