' D'语言支持本地分配的' C'像变长数组?
这样的事情:
void main()
{
size_t szArr = 3;
int[szArr] arr;
}
答案 0 :(得分:3)
不,不是那样的运行时变量。您需要使用替代方案:
alloca
可以分配运行时大小的堆栈空间,就像在C中一样,然后对其进行切片。
int[] a = (cast(int*) alloca(size * int.sizeof))[0 .. size];
由于alloca
的工作原理,不能被抽象为函数。你可以把它变成一个mixin字符串。
你可以使用静态数组,就像在另一个答案中所说的那样,然后将其切成一个大小。类似的东西:
int[1024] buffer;
int[] runtimeSized = size <= buffer.length ? buffer[0 .. size] : (new int[](size);
由于缓冲区是静态大小的,如果可以,你可以将其切片,如果没有,则进行常规数组(或者你可以抛出&#34;数据太大&#34;某种异常)。
如果您愿意,可以将其抽象为一个漂亮的小结构,以便于使用。
请记住,在函数返回后存储对堆栈数据的引用是无效的,但是编译器在指出你执行它的位置时没有多大帮助。