On Mon, 12 Apr 2010 15:36:19 -0400, Joseph Wakeling <joseph.wakel...@webdrake.net> wrote:

Joseph Wakeling wrote:
(Actually I'm still having some issues with this, despite using
assumeSafeAppend, but more on that in a separate email.)

... solved; it's interesting to note that assumeSafeAppend has to be
used in _exactly_ the same scope as the append ~= itself.

e.g. with this loop, the memory blows up:

    ////////////////////////////////////////////////////////////////
    foreach(uint i;0..100) {
        x.length = 0;

        assumeSafeAppend(x);

        foreach(uint j;0..5000)
            foreach(uint k;0..1000)
                x ~= j*k;

        writefln("At iteration %u, x has %u elements.",i,x.length);
    }
    ////////////////////////////////////////////////////////////////

This should work as you expect. Can you produce a full code example? Are you reserving space in x before-hand?


... while with this one it's OK:

    ////////////////////////////////////////////////////////////////
    foreach(uint i;0..100) {
        x.length = 0;

        foreach(uint j;0..5000) {
            foreach(uint k;0..1000) {
                assumeSafeAppend(x);
                x ~= j*k;
            }
        }

        writefln("At iteration %u, x has %u elements.",i,x.length);
    }
    ////////////////////////////////////////////////////////////////

The first assumeSafeAppend is the only one that matters. Subsequent ones are wasted cycles. I'm unsure why this one works and the other doesn't. Again, I need full compilable examples.

-Steve

Reply via email to