Sizeof class instance

Justin Johansson no at spam.com
Sat Oct 3 17:19:44 PDT 2009


Jeremie Pelletier Wrote:

> Justin Johansson wrote:
> > Jarrett Billingsley Wrote:
> > 
> >> On Sat, Oct 3, 2009 at 5:50 PM, Justin Johansson <no at spam.com> wrote:
> >>> How does one determine the sizeof (in bytes) of an instance of a class in D?
> >>>
> >>> .sizeof works as advertised for structs, but for reference types,
> >>> .sizeof yields the sizeof the referencing variable (effectively same as size of a pointer)
> >>> and not the size of the underlying instance.
> >>>
> >>> I did try scanning the NG and read spec_D1.00.pdf.  Perhaps I missed it in the latter.
> >>>
> >>> btw. I was poking under the hood of std.xml and though, wow, instances of Element
> >>> class look humongous, and so I'm interested to how exactly how humongous.
> > 
> >> There's no way to get it at compile-time in D1. The best you can do is
> >> Class.classinfo.init.length.
> >>
> >> In D2, you can use __traits(classInstanceSize, Class).
> > 
> > 
> > Thanks Jeremie and Jarrett for answers.
> > 
> > For investigative purposes (rather than adding up class member sizes in my head),
> > would I get a fair answer if I copied the class data members into a struct, did a struct
> > sizeof and added 4 bytes to allow for a virtual function table pointer (in the class and
> > assuming the class has a VFT)?
> 
> You forgot the monitor pointer of the class, so thats (size_t.sizeof * 
> 2) to add to the size of the struct.
> 
> I wasn't aware of the traits method either, I just made this helper 
> template to simplify its syntax:
> 
> template SizeOf(alias C) if(is(C == class)) {
> 	enum ClassSizeof = __traits(classInstanceSize, C);
> }


Sorry I misread the earlier answer.  This works for my investigative purposes as explained:

   writefln( "Element instance size = %d", Element.classinfo.init.length);

Still glad I asked this last question though because I hadn't thought of monitor.  Also I imagine that
if a class has interfaces, this can impact upon the size as well.

My early years with microprocessors (8085, 8086, 6809 etc) and assembly language has always made
me curious about how compilers realize their magic at the bit and byte level.




More information about the Digitalmars-d-learn mailing list