What's the point of static arrays ?

Simen Kjærås simen.kjaras at gmail.com
Fri Jul 10 11:20:17 UTC 2020


On Friday, 10 July 2020 at 10:13:23 UTC, wjoe wrote:
> However stack memory needs to be allocated at program start. I 
> don't see a huge benefit in allocation speed vs. heap 
> pre-allocation, or is there?
> I mean 1 allocation vs 2 isn't going to noticeably improve 
> overall performance.

You seem to still be thinking of static arrays as the same kind 
of "thing" as a dynamic array. They're (usually) more like ints 
or structs than containers: they're generally small, they're 
often parts of other structures or classes, and they're fairly 
often the element type of a larger dynamic array. For instance, a 
bitmap image could be a byte[4][][], with dynamic dimensions 
3840x2160. If instead of byte[4] we used byte[], not only would 
things grind to a halt immediately, we'd also be using massively 
more memory.

When you're using a static array on the stack, it's usually just 
because it's more convenient to say `int[16] buffer;` than `auto 
buffer = new int[16];`. The fact it may be faster is mostly a 
side benefit. Also, even if you did preallocate such a buffer, 
there's the overhead of remembering how to get to it, the work of 
setting it up, probably a function call on use, etc. The 
alternative is terser, built-in, more obvious to maintainers, 
pretty unlikely to overflow the stack, and very unlikely to be 
slower. Allocating a multi-MiB static array on the stack is a 
sign that you're using your screwdriver as a hammer, and there 
are probably better ways to do what you're trying to do.


>>     a[]
> What happens here exactly ?

It creates a dynamic array that points to the data in the static 
array. It's just shorthand for a[0..$]:

unittest {
     int[4] a = [1,2,3,4];

     auto b = a[];
     assert(b.length == 4);
     assert(b.ptr == &a[0]);

     auto c = a[0..$];
     assert(b is c);
}

--
   Simen


More information about the Digitalmars-d-learn mailing list