What guarantees does D 'const' provide, compared to C++?
Chris Cain
clcain at uncg.edu
Thu Aug 16 20:57:20 PDT 2012
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.
More information about the Digitalmars-d
mailing list