- 不要害怕收割者
- 快速生活
- 走自己的路。第一部分。叠放
- 走自己的路。第二部分。一堆
像今天使用的许多语言一样,D附带了垃圾收集器(GC)。充分利用其优势,可以完全不考虑GC地开发多种类型的软件。但是,GC有其缺陷,在某些情况下,垃圾回收是不可取的。对于这种情况,该语言允许您暂时禁用垃圾收集器,甚至完全不使用它。
为了获得最大的垃圾收集器,尽量减少它的缺点,你需要有一个良好的GC是如何工作d语言理解。一个良好的开始是在dlang.org垃圾收集页面,它提供了GC的理由在d,并提供了几个与他一起工作的技巧。这是更详细介绍该主题的系列文章中的第一篇。
这次,我们将只涉及最基本的内容,重点是可以通过GC导致内存分配的语言功能。将来的文章将介绍在必要时禁用GC的方法以及帮助解决其不确定性的惯用法(例如,由GC控制的对象析构函数中的资源管理)。
首先要了解的是,D的垃圾回收器仅在内存分配期间触发,并且仅当没有内存可分配时才触发。他没有坐在后台,而是定期扫描堆垛并收集垃圾。您需要了解这一点,才能编写GC控制的内存有效代码。考虑以下示例:
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];
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在撰写本文时提供的帮助。