runtime static arrays
bearophile
bearophileHUGS at lycos.com
Tue Nov 20 16:29:15 PST 2012
Jonathan M Davis:
> Personally though, I wish that the length of static arrays
> could be set at
> runtime and don't really understand why you can't (aside from
> the fact that
> you can't in standard C - gcc will let you though).
Variable Length Arrays are part of the standard in C since C99,
and they are in C11 still.
D doesn't have VLAs, I have asked for them since lot of time. I
don't know why Walter doesn't like them. After using Ada language
a little, I believe that stack allocation is very useful when you
want to write fast code.
VLAs are a little unsafe in D because they are not on the heap,
but a good type system is able to make them safe (some kind of
static region analysis, done by the Rust language compiler, not
present in D).
Beside the problem of memory ownership, and problems with stack
overflows, there are other problems with VLAs, like how the D
type system has to denote them, and how to move them around. How
do you return them? Some considerations:
void foo(int n) {
int[](n) data; // D VLA syntax?
static assert(sizeof(data) = sizeof(size_t)); // 1 word?
static assert(is(typeof(data) == int()));
bar(data); // OK, decays to dynamic array
bar(data.dup); // OK, dup turns it on a heap allocated
dynamic array
spam(data); // probably not allowed.
}
void bar(int[] a) {}
void spam(int[10] b) {}
void baz(int() c) {} // not allowed syntax.
Here I have used a different syntax because I think there is a
problem with using the normal syntax: D performs CTFE when you
call a function in a context that asks for a compile-time result
value. Currently static array definitions require a compile-time
value, so they induce CTFE. If D gains VLAs stack arrays can be
created with a run-time size too, so how does the compiler knows
if you want CTFE and to create a fixed array or you want to call
the function at runtime and create a VLA? A different syntax
avoids this problem.
VLAs are meant only for automatic variables, you can't put one of
them in structs or class instances, or in global scope. Also a
VLA decades in a dynamic array with dup or to fixed size whem
given to a function with fixed sized argument, so you can't pass
VLA around.
One advantage of VLA is a less bug-prone syntax compared to
alloca(), expecially when you want 2D, 3D, etc VLA array.
C++11 has not introduced VLA for unclear reasons, but probably
one reason was to not add more complexities. In the D type system
there are dynamic arrays, so the situation is better.
Maybe some kind of VLAs will be present in C++14, according to
what the C++ committee says.
Bye,
bearophile
More information about the Digitalmars-d-learn
mailing list