Ref parameter: intended behavior or bug?

Mike Parker aldacron71 at yahoo.com
Wed Aug 22 02:59:17 PDT 2007


Bill Baxter wrote:
> Mike Parker wrote:
>> I knocked up a sample program to demonstrate reference parameters, 
>> then got a result that wasn't at all what I expected:
>>
>> ====================================
>>
>> import std.stdio;
>>
>> struct MyStruct
>> {
>>     ubyte[] contents;
>> }
>>
>> class MyClass
>> {
>>     ubyte[] contents;
>> }
>>
>> void structDefault(MyStruct ms)
>> {
>>     writefln("Struct default: %d", ms.sizeof);
>> }
>>
>> void structRef(ref MyStruct ms)
>> {
>>     writefln("Struct ref: %d", ms.sizeof);
>> }
>>
>> void classDefault(MyClass mc)
>> {
>>     writefln("Class default: %d", mc.sizeof);
>> }
>>
>> void main()
>> {
>>     MyStruct ms;
>>     MyClass mc = new MyClass;
>>         structDefault(ms);
>>     structRef(ms);
>>     classDefault(mc);
>> }
>> ==================================
>>
>> Here's the output:
>>
>> Struct default: 8
>> Struct ref: 8
>> Class default: 4
>>
>> The first and last are what I thought they would be, but I expected 
>> the Struct ref line to output 4, since it's supposed to be a ref 
>> parameter. I assume this to be a bug, but want to make sure there's 
>> not something intended going on.
> 
> 'ref' is not a type constructor in D, it is a storage class.
> .sizeof gives the size of the type.  The storage class shouldn't affect 
> that.

But it's a bit inconsistent, is it not? Consider this function:

void structPtr(MyStruct* ms)
{
     writefln("Struct ptr: %d", ms.sizeof);
}

This will print 4. Why should the behavior of 'ref' be any different 
than that of '*'? If I want the size of the type, I would use 
MyStruct.sizeof.


More information about the Digitalmars-d-learn mailing list