Get class size of object

JS js.mdnq at gmail.com
Sun Aug 11 12:15:37 PDT 2013


On Sunday, 11 August 2013 at 19:08:58 UTC, Simen Kjaeraas wrote:
> On 2013-08-11, 20:33, JS wrote:
>
>> I think you're missing the point to some degree(I realize 
>> there is a diff between an object and a type, but I should be 
>> able to easily get the class size of an object at run time 
>> regardless if the object is typed as a base class). The code 
>> below does this, but at a cost of verbosity.
>>
>> Here is code that exactly demonstrates what I am essentially 
>> trying to do. The only drawback now is having to mixin the 
>> template for each class which I would want to automate and it 
>> would be nice to wrap the RT and CT methods in subclasses 
>> without overhead.
>
> It would appear that some information is lost when calling 
> typeid from an
> interface. I would have expected this to work:
>
> interface I {
>     final
>     size_t size() {
>         return typeid(this).init.length;
>     }
> }
>
> class A {}
>
> class B : A, I {
>     int a;
> }
>
> void test1() {
>     I i = new B();
>     assert(i.size > 0); // Fails.
> }
>
>
> A bit more experimentation shows:
>
> void test2() {
>     B b = new B();
>     I i = b;
>     A a = b;
>
>     assert(typeid(a) == typeid(b)); // Passes.
>     assert(typeid(i) == typeid(b)); // Fails.
>
>     assert(typeid(b).init.length > 0); // Passes.
>     assert(typeid(i).init.length > 0); // Fails.
> }
>
>
> It appears thus that the error is in typeid(interface), which 
> does not
> give the actual typeid.
>
> The workaround is as follows:
>
>
> interface I {
>     final
>     size_t size() {
>         return typeid(cast(Object)this).init.length;
>     }
> }
>
>
> Is this what you want? Is it good enough? I have no idea, as 
> you're
> notoriously bad at describing what you want, but pretty good at
> attacking people.
>
> If you're looking for a no-overhead solution, then this might 
> not be
> good enough. I'm surprised that a virtual function call is fine,
> though.

I attack people because they are arrogant bastards. They do 
nothing to help but only contribute to the chaos. They deserve to 
be attacked because arrogant people are evil.

In any case I think your solution might be correct. Originally I 
was using interfaces and do recall it working with classes but 
not interfaces but didn't know how to get it to work.



More information about the Digitalmars-d-learn mailing list