Thread overview
Hidden members of Class objects
Mar 07
kinke
Mar 07
cc
March 06

I notice that a class with no data members has a size of two words (at 64 bits). Presumably there's a pointer to a table of virtual functions, and one more. Is the Vtable first?

A COM class that inherits from IUnknown and has no data members has a size of three words, presumably as before plus something that ordinarily is in the Vtable but can't be for a COM object as it has its own layout of that.

What is actually in these objects using that space?

March 06
On Wed, Mar 06, 2024 at 11:39:13PM +0000, Carl Sturtivant via Digitalmars-d-learn wrote:
> I notice that a class with no data members has a size of two words (at 64 bits). Presumably there's a pointer to a table of virtual functions, and one more. Is the Vtable first?
[...]
> What is actually in these objects using that space?

In D, there's a pointer to the vtable and another pointer to a Monitor object (used for synchronized methods).  There was talk about getting rid of the Monitor field years ago, but nothing has happened yet.


T

-- 
MAS = Mana Ada Sistem?
March 07
On Wednesday, 6 March 2024 at 23:45:00 UTC, H. S. Teoh wrote:
> In D, there's a pointer to the vtable and another pointer to a Monitor object (used for synchronized methods).  There was talk about getting rid of the Monitor field years ago, but nothing has happened yet.

Very interesting: is the monitor field ever touched by compiled D code at any point nowadays? Or is it just vestigial?

March 07

On Thursday, 7 March 2024 at 00:28:17 UTC, Carl Sturtivant wrote:

>

On Wednesday, 6 March 2024 at 23:45:00 UTC, H. S. Teoh wrote:

>

In D, there's a pointer to the vtable and another pointer to a Monitor object (used for synchronized methods). There was talk about getting rid of the Monitor field years ago, but nothing has happened yet.

Very interesting: is the monitor field ever touched by compiled D code at any point nowadays? Or is it just vestigial?

It's (lazily initialized and) used by the synchronized(<expression>) statement (§3 of https://dlang.org/spec/statement.html#synchronized-statement) and the mentioned synchronized class methods (https://dlang.org/spec/class.html#synchronized-methods).

March 07
On 07/03/2024 1:28 PM, Carl Sturtivant wrote:
> On Wednesday, 6 March 2024 at 23:45:00 UTC, H. S. Teoh wrote:
>> In D, there's a pointer to the vtable and another pointer to a Monitor object (used for synchronized methods).  There was talk about getting rid of the Monitor field years ago, but nothing has happened yet.
> 
> Very interesting: is the monitor field ever touched by compiled D code at any point nowadays? Or is it just vestigial?

Yes its opt-in. https://dlang.org/spec/statement.html#synchronized-statement

March 07

On Thursday, 7 March 2024 at 00:38:30 UTC, Richard (Rikki) Andrew Cattermole wrote:

>

On 07/03/2024 1:28 PM, Carl Sturtivant wrote:

>

On Wednesday, 6 March 2024 at 23:45:00 UTC, H. S. Teoh wrote:

>

In D, there's a pointer to the vtable and another pointer to a Monitor object (used for synchronized methods).  There was talk about getting rid of the Monitor field years ago, but nothing has happened yet.

Very interesting: is the monitor field ever touched by compiled D code at any point nowadays? Or is it just vestigial?

Yes its opt-in. https://dlang.org/spec/statement.html#synchronized-statement

I've stumbled over the Monitor/etc sometimes writing serialization, RPC, LUA etc modules iterating over class members, looking for UDAs, after trying to separate everything out using isFunction/isTemplate/etc, on top of dealing with overload spaghetti, I now just explicitly do something dumb like this to get those edge cases out of the way:

static foreach (sym; __traits(allMembers, T))
static if (!["__ctor","__dtor","__xdtor","Monitor","factory"].canFind(sym)) {{
	...
March 26

On Thursday, 7 March 2024 at 00:38:30 UTC, Richard (Rikki) Andrew Cattermole wrote:

>

Yes its opt-in. https://dlang.org/spec/statement.html#synchronized-statement

As you mentioned in another thread there's handy ABI documentation for classes and interfaces just here https://dlang.org/spec/abi.html#classes that spells out the story.