Thread overview
classInstanceSize and vtable
Oct 24, 2014
Etienne Cimon
Oct 24, 2014
bearophile
Oct 24, 2014
Etienne Cimon
Oct 24, 2014
bearophile
Oct 24, 2014
Simen Kjaeraas
October 24, 2014
I'm trying to figure out the size difference between a final class and a class (which carries a vtable pointer).

import std.stdio;

class A { void print(){} }

final class B { void print(){} }

void main(){
        writeln(__traits(classInstanceSize, A));
        writeln(__traits(classInstanceSize, B));
}


Returns:
8
8

I'm not sure, why does a final class carry a vtable pointer?
October 24, 2014
Etienne Cimon:

> I'm not sure, why does a final class carry a vtable pointer?

In D all class instances contain a pointer to the class and a monitor pointer. The table is used for run-time reflection, and for standard virtual methods like toString, etc.

Bye,
bearophile
October 24, 2014
On 2014-10-23 20:12, bearophile wrote:
> In D all class instances contain a pointer to the class and a monitor
> pointer. The table is used for run-time reflection, and for standard
> virtual methods like toString, etc.
>
> Bye,
> bearophile

So what's the point of making a class or methods final? Does it only free some space and allow inline to take place?
October 24, 2014
Etienne Cimon:

> So what's the point of making a class or methods final?

It forbids subclassing. And final methods are not virtual, so they can be inlined.

Bye,
bearophile
October 24, 2014
On Friday, 24 October 2014 at 00:21:52 UTC, Etienne Cimon wrote:
> On 2014-10-23 20:12, bearophile wrote:
>> In D all class instances contain a pointer to the class and a monitor
>> pointer. The table is used for run-time reflection, and for standard
>> virtual methods like toString, etc.
>>
>> Bye,
>> bearophile
>
> So what's the point of making a class or methods final? Does it only free some space and allow inline to take place?

Like bearophile said the vtable is required for virtual methods. Consider this code:

import std.stdio : writeln;

class A { void foo() {writeln("A");} }
final class B : A { override void foo() {writeln("B");} }

void main() {
    A a = new B();
    a.foo();
}

In order for the call to foo to run the correct version of foo, B needs to have a vtable. Since all classes in D implicitly inherit from Object, which has some virtual methods, all classes need to have a vtable.

--
  Simen