Address of a class object
Ali Çehreli
acehreli at yahoo.com
Sun Jan 1 16:51:06 UTC 2023
On 1/1/23 01:01, Paul wrote:
> ...on my laptop it prints...
> ```
> Size Alignment Type
> =========================
> 9 4 MyClass
>
> 4FFB20 4FFB24
> ```
> If the size of MyClass is 9 bytes why do MyClassO1 & O2 addresses only
> differ by 4 bytes?
As matheus said, classes are reference types, meaning, class variables
are implemented as pointers. The values above are the addresses of those
pointers. The fact that those values are different by 4 tells us that
the code was compiled for 32 bits.
On the other hand, matheus's values were 8 apart because that
compilation was 64 bits.
> So, I guess my question is actually how do I print out the addresses of
> the MyClassO1 & O2 objects themselves?
You must have missed my earlier answer: You need to cast the variable to
'void*'. That special operation will give you the address of the object.
I am adding the following last line to matheus's example:
// ...
writeln("\n",&(MyClassO1.c),"\t",&(MyClassO2.c));
writeln("\n",cast(void*)MyClassO1,"\t",cast(void*)MyClassO2);
The output:
[...]
7F125FE77010 7F125FE77030 <-- The addresses of the 'c' members
7F125FE77000 7F125FE77020 <-- The addresses of the objects
The reason why objects are 0x10 bytes before the 'c' members is because
a class object has two hidden initial members: the vtbl pointer and the
monitor, both of which are size of a pointer (4 on your system, and 8 on
matheus's system and mine).
Additionally, if you define the class as extern(C++), there will not be
the monitor member. The reason for that is C++ does not have that
concept and it would break interoperability.
Ali
More information about the Digitalmars-d-learn
mailing list