Forum: D Programlama Dili RSS
Sınıf Üyelerine İşaretçilerle Erişmek
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1908 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Sınıf Üyelerine İşaretçilerle Erişmek
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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4508 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ö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
Avatar
huseyin #3
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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.
Huseyin
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4508 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-10-18, 02:22:47 (UTC -07:00)