www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - classInstanceSize and vtable

reply Etienne Cimon <etcimon gmail.com> writes:
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?
Oct 23 2014
parent reply "bearophile" <bearophileHUGS lycos.com> writes:
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
Oct 23 2014
parent reply Etienne Cimon <etcimon gmail.com> writes:
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?
Oct 23 2014
next sibling parent "bearophile" <bearophileHUGS lycos.com> writes:
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
Oct 23 2014
prev sibling parent "Simen Kjaeraas" <simen.kjaras gmail.com> writes:
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
Oct 23 2014