“D”语言是否支持本地分配的“C”(如可变长度数组)?
像这样的东西:
void main()
{
size_t szArr = 3;
int[szArr] arr;
}
Run Code Online (Sandbox Code Playgroud)
不,不是这样的运行时变量。您需要使用替代方案:
alloca
可以分配运行时大小的堆栈空间,就像在 C 中一样,然后对其进行切片。
int[] a = (cast(int*) alloca(size * int.sizeof))[0 .. size];
Run Code Online (Sandbox Code Playgroud)由于工作原理,不能将其抽象为函数alloca
。不过你可以把它变成一个 mixin 字符串。
您可以使用静态数组,就像其他答案中所述,然后将其切片到一定大小。就像是:
int[1024] buffer;
int[] runtimeSized = size <= buffer.length ? buffer[0 .. size] : (new int[](size);
Run Code Online (Sandbox Code Playgroud)由于缓冲区的大小是静态的,因此如果可以的话可以对其进行切片,如果不能的话则创建一个常规数组(或者您可以抛出某种“数据太大”异常)。
如果您愿意,您可以将其抽象为一个漂亮的小结构,以便于使用。
请记住,在函数返回后存储对堆栈数据的引用是无效的,但编译器不会帮助指出您在何处执行此操作。