Optimizing Immutable and Purity

Jason House jason.james.house at gmail.com
Wed Dec 24 11:50:35 PST 2008


Andrei Alexandrescu Wrote:

> Walter Bright wrote:
> > Andrei Alexandrescu wrote:
> >> Walter Bright wrote:
> >>> Andrei Alexandrescu wrote:
> >>>> Bill Baxter wrote:
> >>>>> On Tue, Dec 23, 2008 at 11:30 AM, Jerry Quinn 
> >>>>> <jlquinn at optonline.net> wrote:
> >>>>>> This was an interesting read.  It would be nice to see a 
> >>>>>> discussion of how const is going to fit in in terms of 
> >>>>>> optimization potential, since you can always cast it away.
> >>>>>
> >>>>> It's basically useless for optimizations I think.
> >>>>> Even if the view of the data you have is const, someone else might
> >>>>> have a non-const view of the same data.
> >>>>> So for instance, if you call any function, your "const" data could
> >>>>> have been changed via non-const global pointers to the same data.
> >>>>>
> >>>>> --bb
> >>>>
> >>>> Const is still useful because inside a function you know for sure 
> >>>> that another thread can't modify the data.
> >>>
> >>> I think you meant immutable.
> >>
> >> I meant const.
> > 
> > 
> > In the future, of course, "shared const" means another thread can modify 
> > it, but "const" means it cannot. Is that what you meant?
> 
> Here's an example:
> 
> int foo(const int*);
> 
> void bar() {
>      int a = 5;
>      foo(&a);
>      // can assume a is unmodified?
> }
> 
> There are two issues here. One is that the const guarantees that foo 
> does not legally change a, so it is useful for an optimization (e.g. 
> assume that a == 5 after the call to foo). The second issue is that 
> compilers often assume that a function call may change the stack of the 
> caller in an arbitrary way. I think it is safe to lift that assumption 
> for D programs and consider a functions' automatic variables as private 
> to the function.
> 
> 
> Andrei

You have to be extremely careful with this kind of thing.  If any calls are made with a mutable &a before the call to foo, that optimization can no longer be performed. Also, if a's type changes and used a custom constructor, then that optimization is unreliable for anything other than taking the object's address. If a mutable reference is leaked, all function calls become suspect...



More information about the Digitalmars-d mailing list