What guarantees does D 'const' provide, compared to C++?
Mehrdad
wfunction at hotmail.com
Thu Aug 16 21:17:32 PDT 2012
On Friday, 17 August 2012 at 03:57:21 UTC, Chris Cain wrote:
> On Friday, 17 August 2012 at 03:42:23 UTC, Mehrdad wrote:
>> Yes, I 100% realize 'pure' and 'immutable' are advantages over
>> C++.
>> The question was about 'const' by itself, though, because
>> otherwise that's not a fair comparison. (The goal is comparing
>> C++ const to D const, not C++ const to D const + immutable +
>> purity.)
>
> I don't know what to tell you then. If you have a non-const
> pure function and add const to it, then you can make all kinds
> of optimizations for free basically. But, as you've found, if
> you completely ignore purity, you can find some ways around
> that and the compiler would have to potentially perform some
> expensive checks to do the same optimizations (unless they're
> just not valid).
>
> You can probably do more optimizations on primitive types
> easier (but they obviously have their own limitations), but
> many of those same optimizations could potentially be done on
> C++'s const primitives as well. But really, the biggest
> differentiation between C++'s const and D's const comes in to
> play with non-primitives. C++'s const on classes, for instance,
> gives you _no_ guarantees (none, at all, unless you dive into
> the class and take a close look) and therefore _no_
> optimizations without major costly calculations and certainly
> no easy reasoning.
>
> OTOH, D's const does give you guarantees. Combine that with
> pure and you've got huge amounts of reasoning. And yes, I'd say
> this answers your topic's question on what D's const does for
> you. Clearly, a pure function without const doesn't provide you
> with the same reasoning as a pure function with const.
>
> writeln(s.pureMutatingFunc());
> writeln(s.pureMutatingFunc()); // guaranteed not to change
> globals ... restricted to only changing s and, transitively,
> everything s points to
>
> const: Prevents changing s and, transitively, everything s
> points to (through the s view, of course ... doesn't say
> anything about global data or other views available to you
> because of global data, as you've found).
>
> ergo, we can do this:
>
> writeln(s.pureConstFunc());
> writeln(s.pureConstFunc()); // definitely the same as above call
>
>
> Now an impure function can modify globals, so it shouldn't
> surprise you that if s has a pointer to a global, you can
> modify the global and therefor the view s represents will also
> have a change.
Okay so basically, the conclusion I'm drawing is that you have to
combine it with pure/immutable in order to get much more out of
it than compared with C++; otherwise, it's not really different.
Thanks!
More information about the Digitalmars-d
mailing list