What's the point of static arrays ?
Ali Çehreli
acehreli at yahoo.com
Fri Jul 10 21:24:08 UTC 2020
On 7/10/20 8:03 AM, wjoe wrote:
> What I'm saying is even if this allocation is slow let's say 5ms, but it
> only happens once, that wouldn't matter to overall performance at all.
Yes, you are correct and there are dynamic arrays that are allocated
once in many programs.
I haven't read the rest of your post but you've said elsewhere that a
static array is on the stack. Yes, there are such static arrays but the
issue is not that simple.
struct S {
float[3] rgb; // Can be on the stack or dynamic memory
}
The member of that struct can be anywhere:
void foo() {
S s; // On the stack
auto arr = [ S() ]; // On dynamically allocated memory
}
Additionally, as is common and understandable in D, we are conflating
dynamic arrays and slices. The way I see it is dynamic array is owned by
the D runtime. Although a slice is an interface to such dynamic arrays,
a slice can start its life with non-dynamic arrays and may or may not
move to accessing dynamic arrays.
struct S {
float[] arr; // A slice can use dynamic or static memory
}
void foo() {
float[10] storage;
auto a = S(storage[1..7]); // Slice is referring to the stack space
auto b = S();
b.arr ~= 1.5; // Slice is referring to dynamic memory
}
What is important is overhead:
1) Allocation: Only sometimes an issue.
2) Cost of the slice object (1 pointer and 1 size_t): The cost of this
may be enormous. (Compare the 12-byte rgb above to a 16-byte slice
overhead.)
3) Cost of accessing the elements: The access through that extra level
of indirection may be a cost but the CPU can alleviate it by
pre-fetching or caching but only for some access patterns.
4) Bounds checking: Some bounds checks for static arrays can be elided
at run time.
So, there are cases where a dynamic array is better (or must), there are
cases there is no winner and there are cases where a static array is a
huge win.
Ali
More information about the Digitalmars-d-learn
mailing list