Performance improvements for D / DMD compiler.
Chris Nicholson-Sauls
ibisbasenji at gmail.com
Sat Jan 20 01:40:57 PST 2007
Bill Baxter wrote:
> Walter Bright wrote:
>> Bill Baxter wrote:
>>> The question is how can we write functions in D that take big structs
>>> as parameters in such a way that it is:
>>> A) efficient and
>>> B) guaranteed not to change the caller's value
>>>
>>> In C++ the answer is const LargeStruct&.
>>
>> C++ doesn't *guarantee* it won't change. There are at least two legal
>> ways to do it.
>
> Very true. What I'm after is really a concise way to both
> a) document to readers of the code that it won't change and
> b) get the compiler to zap me if I accidentally try to modify it.
>
>>> In D the answer is...
>>
>> There aren't const references in D. But the 3 ways to pass it by
>> pointer are:
>>
>> 1) inout
>> 2) take the address and use a pointer
>> 3) make it a class instead
>
> And none of those accomplishes a or b.
>
> --bb
Just a thought: B) can be accomplished with an Interface that only exposes gettors.
Granted, though, that 1) it means defining everything you want to be read-only as a
property, but these would be optimized away by inlining anyhow, 2) you have to write an
Interface (which isn't a big deal, IMHO, but I know some people can be annoyed with them).
Also, you would want to make the implementor class and all methods 'final' to avoid
potential virtuality overhead.
Something akin to:
<code>
interface IFoo {
int alpha () ;
int beta () ;
}
final class Foo : IFoo {
private {
int m_alpha ;
int m_beta ;
}
int alpha () { return m_alpha ; }
int beta () { return m_beta ; }
int alpha (int x) { return m_alpha = x ; }
int beta (int x) { return m_beta = x ; }
}
void somefunc (IFoo obj) {
// do stuff with obj.alpha and obj.beta
}
auto myfoo = new Foo;
somefunc(myfoo);
</code>
-- Chris Nicholson-Sauls
More information about the Digitalmars-d
mailing list