June 19, 2011

Şimdi 'Bellek Yönetimi' dersini yazıyorum. (Aslında aylar önce başlamıştım; sonunda artık bitiriyorum.) Çöp toplayıcıdan boş bir yer ayırıp orada emplace() ile nesne kurmayı denerken derleme hatalarıyla karşılaştım. (emplace() yalın gösterge değil, dilim istiyor.) Phobos'ta nasıl kullandıklarını araştırınca da daha önceden gözümden kaçmış olan bir olanağı öğrendim.

D'de yalın göstergeler çok kolayca dilime dönüştürülebiliyorlar:

int * p = /* gerçekten (en az) 100 bayt olduğunu bildiğimiz bir yer */;
auto dilim = p[0..100];

Böylece bir dilim edinmiş oluyoruz. O bilgi şuradaki Slicing başlığının altındaki son bilgi olarak geçiyor:

http://d-programming-language.org/arrays.html

Göstergeden dilim elde eden bir örnek:

import core.memory;  /* GC (çöp toplayıcı) için */
import std.stdio;
import std.conv;     /* emplace için */

class Sınıf
{
   int i;
   int j;
}

void main()
{
   immutable büyüklük = __traits(classInstanceSize, Sınıf);
   auto yer = GC.calloc(büyüklük)[0..büyüklük];
   auto nesne = emplace!Sınıf(yer);

   writeln("büyüklük: ", büyüklük);
   writeln("adres   : ", yer.ptr);
   writeln("nesne.i : ", &(nesne.i));
   writeln("nesne.j : ", &(nesne.j));
}

Notlar:

  • __traits'i ve classInstanceSize'ı çok yeni anlatmıştım: http://ddili.org/ders/d/tur_nitelikleri.html (Yukarıda Sınıf.sizeof kullanamayız.)

  • calloc void* döndürüyor. İşte onu bir void[] türüne dönüştürmek için sonuna [0..büyüklük] yazılıyor.

  • emplace, belirtilen dilimin içine belirtilen türden nesne kurar

  • Nesnenin üyelerinin adreslerini yazdırarak da gerçekten de dilimin içinde yaşadıklarını gösteriyorum:

'büyüklük: 24
adres : 7FBF940E3F20
nesne.i : 7FBF940E3F30
nesne.j : 7FBF940E3F34
'

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]