Optimisation possibilities: current, future and enhancements
Meta via Digitalmars-d
digitalmars-d at puremagic.com
Fri Aug 26 19:40:46 PDT 2016
On Friday, 26 August 2016 at 19:51:02 UTC, Patrick Schluter wrote:
> On Friday, 26 August 2016 at 14:03:13 UTC, Meta wrote:
>> On Friday, 26 August 2016 at 10:51:15 UTC, Johan Engelen wrote:
>>> On Thursday, 25 August 2016 at 14:42:28 UTC, Basile B. wrote:
>>>>
>>>> I'll add
>>>>
>>>> * create temporaries based on the const function attribute.
>>>
>>> Struct method constness (as in your example) does not mean
>>> that the return value is constant when calling it twice in a
>>> row. As pointed out by others, the function needs to be pure.
>>> Dlang pureness is not a strong enough guarantee.
>>> For example, this is explicitly allowed by the spec:
>>> ```
>>> pure int foo()
>>> {
>>> debug writeln("in foo()"); // ok, impure code allowed in
>>> debug statement
>>> return 1;
>>> }
>>> ```
>>> That makes it illegal to transform `foo()+foo()` to `a=foo();
>>> a+a`, at least in debug builds.
>>>
>>> David discusses your proposed optimization, and why it cannot
>>> be done in general (!) on Dlang pure functions.
>>> http://klickverbot.at/blog/2012/05/purity-in-d/
>>>
>>> -Johan
>>
>> Here's an example that doesn't even need to use debug
>> statements, and is perfectly legal.
>>
>> class Test
>> {
>> int n;
>>
>> void setN(int val) pure
>> {
>> n = val;
>> }
>>
>> int getN() const pure
>> {
>> return n;
>> }
>> }
>
> getN() is not pure, simple as that (and an ideal compiler
> should complain in that case). A function is pure if it depends
> only of the state passed as parameter. If it touches memory
> that is set outside its scope it is NOT PURE!!!
>
>>
>> import std.stdio;
>>
>> void main()
>> {
>> auto t = new Test();
>> writeln(t.getN()); //Prints 0
>> t.setN(1);
>> writeln(t.getN()); //Prints 1
>
> It has to, as getN() is not pure.
>
>> }
>
> In case you didn't get it, getN() is not pure. Marking it as
> such is a BUG!.
Not according to the D spec.
More information about the Digitalmars-d
mailing list