Thread overview
Sınıf Üyelerine İşaretçilerle Erişmek
Sep 20, 2017
Salih Dinçer
Sep 21, 2017
huseyin
September 20, 2017

Hafızada henüz yeni kurulmuş ve herhangi bir ilkleme yapılmamış yerel bir sınıfın üyelerine işaretçiler vasıtasıyla tam kontrollü bir şekilde erişmek mümkün müdür?

Teşekkürler...

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

September 20, 2017

Öncelikle, ilkleme yapılmaması D'de çaba gerektiriyor çünkü değişkenler (üyeler dahil) normalde ilkleniyorlar. Tabii istersek '=void' ile ilklenmelerini önleyebiliyor. Ayrıca normalde bir de kurucu işlev işletiliyor ama onun da önüne geçmek mümkün. Ama konunun özünde ilkleme yok galiba...

Bildiğin gibi, normal olarak aşağıdaki gibi oluşturulan bir nesnenin değişkeni (aşağıdaki 'foo') aslında perde arkasında bir göstergeden başka bir şey değil.

Üyelere gösterge ile erişmenin iki yolu var:

  • Üyenin adresini almak

  • Değişkeni 'cast(void*)' ile dönüştürmek. Bu dönüşüm nesnenin adresini veriyor.

import std.stdio;

class Foo {
   double d;
   int i;
}

void main() {
   auto foo = new Foo();

   writefln("nesne: %s", cast(void*)foo);
   writefln("d    : %s (%s bayt ötede)", &foo.d, Foo.d.offsetof);
   writefln("i    : %s (%s bayt ötede)", &foo.i, Foo.i.offsetof);
}

Ali

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

September 21, 2017

Burada foo nun tuttuğu şey tam olarak kurulan objenin başlangıç adresi mi? double d ve int i ye array'e erişir mantığında mı erişiliyor yani bu konuyu merak ediyordum bayadır.

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

September 21, 2017

Evet, perde arkasında foo aslında bir adres değeri. Ama üyelere dizi indeksi mantığıyla değil, başlangıç adresinden kaç bayt uzakta mantığı ile erişiliyor.

Sonuçta, bizim 'foo.i' diye yazdığımız kod bir anlamda aşağıdaki kodun eşdeğeri gibi işletiliyor:

   *cast(int*)((cast(void*)foo) + Foo.i.offsetof)

Yani, "nesnenin başlangıç adresine i'nin uzaklığını ekle ve orayı int gibi kullan".

Ama mikro işlemci bu konuda yarar sağlıyor ve örneğin aslında her üye erişimi için toplama işlemi gerçekleşmiyor. (Aslında gerçekleşiyor ama çok daha hızlıca mikro işlemcinin kendisi tarafından hallediliyor.)

Ali

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