Address of a class object

Ali Çehreli acehreli at yahoo.com
Sun Jan 1 01:13:10 UTC 2023


On 12/31/22 16:35, Paul wrote:

 > Can I acquire the address of a class object,

Answering that question literally, yes, you can by casting the class 
variable to void*. But note: 'class object' means the instance of class 
in D.

 > not a class variable (i.e.
 > the instantiations of the class)

D terminology is different there: A class variable is a reference to the 
class object (that carries the member variables, etc. of a class instance.)

   auto c = new C();

'c' is the *variable*, providing access to the *object* in dynamic memory.

 > but the object definition itself?

As H. S. Teoh answered, Python etc. can do that but not D's compilation 
model.

The following program tries to demonstrate that the members are offset 
two void* sizes further from the address of the object:

class C {
     int i;
}

void main() {
     auto c = new C();

     const likelyOffsetOfMembers = 2 * (void*).sizeof;

     // HERE:
     const objectAddrInDynamicMemory = cast(void*)c;

     assert(objectAddrInDynamicMemory + likelyOffsetOfMembers == &c.i);
}

If the class is defined as extern(C++), then you must replace 2 above 
with 1:

extern(C++) class C {
     int i;
}

Ali



More information about the Digitalmars-d-learn mailing list