On Monday, 8 February 2016 at 00:54:24 UTC, Era Scarecrow wrote:
Either they use more stack space, or they act normally after their call is done and are deallocated normally (automatically, unless they are passed outside of the scope where they were generated).

It's that "passed outside of the scope where they were generated" that is bothering me.

Consider:

    auto foo (Range) (Range r)
        if (isInputRange!Range)
    {
        return r.randomSample(100).take(10);
    }

    void main ()
    {
        iota(1000).foo.writeln;
    }

If the RandomSample internals are allocated on the stack using the technique you propose, what's going to happen here?


True; Perhaps have one RNG for seeding and one RNG for passing, then reseed after passing the function off, although how far deep some of this could go with it's deeper copying; I don't know.

No, I really don't think that's an approach that's worth pursuing, except as a desperate workaround for the faults of the existing design. RNGs should as much as possible "just work" and the user shouldn't have to concern themselves like this with


Perhaps RNG should be a class outright, which probably removes a lot of these problems.

It does indeed give you the desired reference semantics very cheaply. But now suppose you have lots of RandomSamples being instantiated in the inner loop of your program. If _they_ are also a class, how do you handle their instantiation and deallocation?

Reply via email to