Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
October 24, 2014 classInstanceSize and vtable | ||||
---|---|---|---|---|
| ||||
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 Re: classInstanceSize and vtable | ||||
---|---|---|---|---|
| ||||
Posted in reply to Etienne Cimon | 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 Re: classInstanceSize and vtable | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | 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 Re: classInstanceSize and vtable | ||||
---|---|---|---|---|
| ||||
Posted in reply to Etienne Cimon | 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 Re: classInstanceSize and vtable | ||||
---|---|---|---|---|
| ||||
Posted in reply to Etienne Cimon | 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
|
Copyright © 1999-2021 by the D Language Foundation