Stack-allocated arrays
Denis Koroskin
2korden at gmail.com
Tue Nov 11 10:17:20 PST 2008
On Tue, 11 Nov 2008 20:39:07 +0300, dsimcha <dsimcha at yahoo.com> wrote:
> I've noticed that, when writing multithreaded number crunching code,
> allocating memory for temporary storage can be a huge threading
> bottleneck.
> Of course, the obvious, but ugly solution is to pre-allocate and recycle
> temp
> variables. However, this breaks encapsulation at every place imaginable.
>
> An alternative that I've tried recently is to use alloca to stack
> allocate the
> temporary arrays if they are small enough. If the arrays being
> allocated are
> larger, I heap allocate, and this isn't a problem because in the large
> array
> case, the number crunching takes up enough time that heap allocations
> aren't
> much of a bottleneck anymore. However, this is also butt ugly because I
> have
> to use a bunch of pointers and casts and explicitly test the size for it
> to
> work. Given that this is highly useful, I think a nice feature for D
> would be
> to have some kind of a scheme to make this clean. For example:
>
> auto foo = newTemp[length];
>
> If length is larger than some arbitrary but reasonable value, this is
> heap
> allocated. If length is small, it is stack allocated. Either way,
> allowing
> the array to escape the current scope is undefined behavior and the
> compiler
> would detect at least the simple cases of this. Ideally, since this
> would
> only be used for temp variables in performance-critical code, the
> contents of
> the array would also not be initialized.
>
> It would be nice to do this in a library, but there's no obvious way to
> do it
> without compiler support, since calling a function sets up a new stack
> frame.
> I'd like to just do it with an interface like:
>
> auto foo = newTemp!(T)(length).
>
> Anyone know any ASM frame pointer hacks to make something like this
> workable?
> Otherwise, is there enough interest in this that it might belong in the
> core
> language?
I would *LOVE* to see Variable-Length Arrays in D (they are implemented in
C99)
void foo(int i)
{
int[i] myArray; // this is a static stack-allocated array (size can't
be changed)
assert(myArray.length() == i);
}
More information about the Digitalmars-d
mailing list