Alıntı (cos00kun):
> çöp toplayıcıyı kullanmazsak evet den kastınız çöp toplayıcıyı program başında durdrurmaktan bahsediyosunuz değilmi ? bildiğim kadarıyla ve sizinde söylediğiniz kadarıyla tamamen devre dışı bırakmanın imkanı yoktu.
Doğru. Çöp toplayıcıdan bellek ayıran olanakların kullanılmamasından bahsediyorum. Örneğin, D'nin kendi dizileri kullanılamaz (eleman ekleme gibi işlemlerinden bahsediyorum; yoksa diziler yine de kullanılabilir). Gerçek hayattan alınmış bir örnek göstereyim. Aşağıdaki setGuid'in iki yüklemesi var. İkincisi, UUID türünden string'e dönüştürüp birincisini çağırıyor.
import std.uuid : UUID;
private string currentGuid;
void setGuid(string guid) {
currentGuid = guid;
}
unittest {
setGuid("42");
assert(currentGuid == "42");
}
void setGuid(UUID guid) {
import std.conv : to;
setGuid(guid.to!string); // <-- to BELLEK AYIRIR
}
unittest {
const ubyte[16] bytes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ];
setGuid(UUID(bytes));
assert(currentGuid == "01020304-0506-0708-090a-0b0c0d0e0f10");
}
void main() {
}
Oradaki setGuid'in bellek ayırmasına hiç gerek olmadığını farkedip ikinci setGuid'i şöyle değiştirdik:
import std.uuid : UUID;
private string currentGuid;
void setGuid(string guid) @nogc nothrow { /* <-- @nogc (ve nothrow) ekledik
* (Aslında önceki kodda da ekleyebilirdik; unutulmuştu.) */
currentGuid = guid;
}
// Değişiklik yok:
unittest {
setGuid("42");
assert(currentGuid == "42");
}
void setGuid(UUID guid) @nogc nothrow { // <-- İşlemleri değiştirerek @nogc (ve nothrow) ekleyebildik
// UUID'nin ne uzunlukta string gerektirdiğini derleme zamanında hesaplıyoruz:
enum size_t guidStringLength = () {
return UUID.init.toString.length;
}();
// O kadarlık yer ayırıyoruz (static olduğundan her seferinde ayrılmıyor):
static char[guidStringLength] guidBuffer;
// std.uuid'nin verilen ara belleğe yazma olanağı varmış; kullanıyoruz:
guid.toString(guidBuffer[]);
// Değişken şimdi bu static belleği gösteriyor:
setGuid(cast(string)guidBuffer);
}
// Değişiklik yok:
unittest {
const ubyte[16] bytes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ];
setGuid(UUID(bytes));
assert(currentGuid == "01020304-0506-0708-090a-0b0c0d0e0f10");
}
void main() {
}
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]