On Tue, 22 Feb 2011 16:34:21 -0500, bearophile <bearophileh...@lycos.com> wrote:

Steven Schveighoffer:

Freeing and allocating memory is fair game for pure functions.

Allocating arrays and objects is possible in pure D functions, despite the memory pointers they contain (like the ptr of a returned array) are different across different calls. This makes those function only formally pure and requires care from both the programmer and the optimizations done by the compiler, to avoid some bad bugs :-)

Example: the C calloc() function is not considered pure, despite what it does is not so far from a pure D function that allocates and returns a dynamic array of ubytes:

import core.stdc.stdlib: calloc;

// OK
pure ubyte* foo1(int n) {
    auto a = new ubyte[n];
    return a.ptr;
}

// Error: pure function 'foo2' cannot call impure function 'calloc'
pure ubyte* foo2(int n) {
    return cast(ubyte*)calloc(n, 1);
}

void main() {}

I would think malloc and friends should be pure, as well as free. They can easily simply be marked pure, since they are C bindings.

Regarding freeing memory in pure functions, I am even less sure.

If allocation is pure, freeing should also be pure. You should be allowed to clean up what you created in a pure function.

To draw a parallel, a GC collect cycle should be "pure", even though it affects global state. Otherwise, the GC would have to be disabled during pure functions.

-Steve

Reply via email to