On Thursday, 21 November 2024 at 06:23:42 UTC, Cos00kun wrote:
> D dili ile ilgili Çöp toplayıcının devre dışı bırakılması ile ilgili Chat GPT ile yaptığım soru cevap çalışmasında bana durum o kadarda kötü değil "@nogc" kullanırsan en azından fonksiyonlarda Garbage Collector'un devre dışı kalacağından dem vurdu :) tamam dedim peki Garbage Collector'u tüm program boyunca nasıl devre dışı bırakırım! Bana aslında bunun "GC.disable()" ile yapılabileceğini söyledi! Tabiki hevesim yine kursağımda kaldı çünkü bu seferde Phobos kütüphanesinde kullandığımız onlarca fonksiyonu kullanamayacağımı söyledi. İki ucu çamurlu değenek :)
Şimdi bir kodun başında D dilinin tüm olanaklarını kullanabilme özgürlüğü ile nasıl Garbage Collector'u devre dışı bırakabilirim ?
Şöyle bir ifade gördüm ama baştaki parantezlerin @nogc ye etkisi nedir anlayamadım?
() @nogc
Merhaba,
Benim izlenimime göre GPT'ler d'nin bu özelliklerine yeterince hakim değiller. Dökümantasyona göre: "Unlike the @nogc attribute, GC.disable() halts collections across all threads, **yet still allows GC allocations**
. Disabling collections". Bu durumda GC.disable() sadece o anda çöp toplama çevrimini durduruyor. Ama çöp toplayıcısından dinamik bellek ayırmaya devam edebiliyorsun. Bu yüzden alttaki örnek çalışıyor.
import std.stdio;
import core.memory : GC;
void main()
{
GC.disable(); // bir sonraki GC.enable()'a kadar çöpler toplanmayacak.
int[] arr = new int[5]; // ama sen ÇT'dan hafıza almaya devam edebilirsin.
arr[] = 13;
GC.enable(); // çöpler toplansın diye izin veriyorsun. Ama nihai olarak runtime karar verecek yani illa burada çöp toplanmayacak. sen artık buna izin verdiğini söylüyorsun
writeln(arr);
}
Gelelim @nogc'ye. Bir fonksiyonu @nogc olarak işaretlersen o fonksiyon GC'ye bağımlı hiçbir işlemi yapamaz. bunun derlenmesini zaten derleyici engeller.
```d
@gogc void yap(){
int[] arr = new int[5]; // olmaz, derleyici buna izin vermez. bunun yerine nogc hafıza tahsis eden yöntemler kullanılmalı
}
@nogc yapNogc(){
int[] arr = (cast(int*)malloc(5 * int.sizeof))[0..5];
...
free(cast(void*)arr.ptr);
}
```
Burada yapNogc'yi nogc olmayan herhangi bir fonksiyon çağırabilir. Ama tersi mümkün değilç nogc fonksiyon sadece diğer nogc fonksiyonları çağırabilir.
Programının tamamı @nogc olsun istiyorsan, main fonksiyonunu nogc olarak markalayabilirsin. bu senin programının hiçbir zaman çöp toplayıcısını kullanmayacağını garanti eder. Ancak bu durumda standart kütüphanenin birçok fonksiyonunu kullanamazsın (bunun yerine Üçüncü parti çözümler var).
betterC ise başka bir konu, şimdilik bu kadar.