- لا تخشى المفغره
- الحياة في الخط السريع
- Go Your Own Way. .
- Go Your Own Way. .
D ، مثل العديد من اللغات المستخدمة اليوم ، يأتي مع جامع القمامة (GC). يمكن تطوير العديد من أنواع البرامج دون التفكير في GC على الإطلاق ، مع الاستفادة الكاملة من مزاياها. ومع ذلك ، فإن GC لديها عيوبها وجمع القمامة غير مرغوب فيه في بعض السيناريوهات. في مثل هذه الحالات ، تسمح لك اللغة بتعطيل جامع القمامة مؤقتًا ، أو حتى الاستغناء عنها تمامًا.
للحصول على أقصى استفادة من جامع القمامة وتقليل عيوبها ، تحتاج إلى فهم كيفية عمل GC في لغة D. نقطة انطلاق جيدة هي صفحة Garbage Collection على dlang.org ، والتي تقدم الأساس المنطقي ل GC في لغة D وتعطي القليل نصائح حول كيفية العمل معه. هذا هو المقال الأول في سلسلة من المقالات التي تغطي الموضوع بمزيد من التفصيل.
هذه المرة سوف نلمس الأساسيات فقط ، مع التركيز على وظائف اللغة التي يمكن أن تسبب تخصيص الذاكرة من خلال GC. ستعرض المقالات المستقبلية طرقًا لتعطيل GC إذا لزم الأمر ، بالإضافة إلى التعابير المساعدة في التعامل مع اللاإحتمالية (على سبيل المثال ، إدارة الموارد في أدوات تدمير الكائنات التي تتحكم فيها GC).
أول شيء يحتاج إلى توضيح: جامع القمامة في D يعمل فقط أثناء تخصيص الذاكرة وفقط إذا لم يكن هناك ذاكرة يمكن تخصيصها. لا يجلس في الخلفية ، ويقوم بفحص الكومة بشكل دوري وجمع القمامة. أنت بحاجة إلى فهم هذا من أجل كتابة كود فعال للذاكرة يتحكم فيه GC. خذ بعين الاعتبار المثال التالي:
void main() {
int[] ints;
foreach(i; 0..100) {
ints ~= i;
}
}
ينشئ هذا البرنامج صفيفًا ديناميكيًا من قيم النوع int
، ثم يستخدم عامل الربط في D لإضافة أرقام من 0 إلى 99 إليه foreach
. ما هو غير واضح للعين غير المدربة هو أن عامل الانضمام يخصص ذاكرة للقيم المضافة من خلال جامع القمامة.
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 لمساعدتهم في إعداد هذا المقال.