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?