On Tuesday, 11 January 2022 at 02:54:34 UTC, Salih Dincer wrote:
> On Monday, 10 January 2022 at 20:55:08 UTC, Ali Çehreli wrote:
> typeof(this)'i en son düzenlediğim şu bölümde öneriyorum:
http://ddili.org/ders/d/ozel_islevler.html
Hocam öncelikle üzülerek belirtmeliyim; Object başlıklı dersi ve içindeki kıymetli bilgileri es geçmişim! Belki başlığın ismi ("benim en üst sınıfla ne işim var ki" demiş olmam) etkiliydi, bilemiyorum :)
Haa bu arada typeid()'yi de yeni öğrendim ya (!) hayıflandım ve yine es geçtiğim için "pesss bana" dedim :)
Bu D, derya&deniz...
Peki bir sınıfın, içerdiği tüm elemanları ile birlikte -işlevlerden oluşan üyeleri (hatta Object'den gelen varsayılan işlevleri de) dışarıda bırakırsak- kaç byte bellekte yer işgal ettiğini öğrenebiliyor muyuz?
Biliyorum, çeşitli yöntemler var ama mesela new ile kurulduğu esnada sınıf içine aktarılan veri ve onun bağlı olduğu sınıflar ile birlikte dallanabiliyor. Yani ayrı ayrı mı hesaplamalı?
Salih, tam olarak ne elde etmek istediğini anlamadım. Ama aşağıdaki örnek üzerinden bir şeyler anlatmak istedim. Hatalı olduğum bir yer varsa muhtemelern Ali abimiz düzeltecektir.
Sınıflar d'de referans tipleridir ve aslında arkasında (T*) gibi pointerlar çalışmaktadır. Bu yüzden örnekte A'nı elemanlarını azaltalım veya yeni elemanlar ekleyelim, her zaman aynı A.sizeof değerinini (size_t tipinden byte değeri) alırız. Struct'larda böyle değil. Ha, structlarda bir de alignment devreye girmekte, Ali abinin kitabında alignment konusuna yer verilmiş olmalı. Konumuza dönelim. A sınıfı için A.sizeof bir pointer'ın kapladığı alana karşılık geliyor. D'de sınıf instance'ının byte olarak hafızada kapladığı alanın değerini ise __traits(classInstanceSize, A) ile öğreniyoruz. İşte buradaki değer, yeni sınıf üyeleri ekledikçe veya sınıf üyelerini çıkardıkça değişir.
Gelelim class üye metodlarına. Bunları ekleyip çıkarmak classInstanceSize'ı etkilemez. Çünkü onlar sınıf tarafından aslında kapsanan fonksiyonlar değiller. Sınıf üye metodları, virtual table'da[1] o sınıfın instance'ı ile ilişkilendirilen fonksiyon pointerlarından ibaretler ve class instance boyutuna katkıları yoktur. Ancaaaaak, aşağıdaki örnekte A sınıfının bir de var4 adında bir fonksiyon pointer üyesi bulunmakta. Bunun gibi üye fonksiyon pointerları class instance boyutunu etkilerler. Çünkü o bir pointer ve bir pointerın kaplayacağı hafıza kadar yer kaplar (bende 8 byte). Sınıf üyelerini benim örneğimde yoruma alarak veya kendin yeni üyeler ekleyerek nasıl bir çıktı alıyorsun deneyip görebilirsin.
Selamlar.
1: https://dlang.org/library/object/type_info__class.vtbl.html
import std;
class B {
}
class A {
int var1;
ubyte var2;
B var3;
void function() var4;
void f1(){}
}
void main()
{
pragma(msg, A.sizeof);
writeln(__traits(classInstanceSize, A));
}