如何在D中创建静态数组,在编译时未指定该大小?
immutable ulong arrayLength = getArrayLength();
ubyte[arayLength]; // <- How to do this basically
答案 0 :(得分:6)
简短回答:你没有。静态数组的大小在编译时始终是已知的。如果你想要一个在运行时确定其大小的数组,那么它需要是一个动态数组。
更长的答案:如果你想自己做点什么,你可以使用C alloca
,它可以在core.stdc.stdlib中找到。但除非你真的需要,否则我不会建议搞乱这类事情。
另一种方法是使用一个静态数组,如果你想要的大小不大于它,并且如果它最终变大,那么就分配一个动态数组。如果你愿意,你甚至可以创建包装类型来处理它。这是一个简单的
struct StaticArray(T, size_t defaultLen = 10)
{
public:
this(size_t length)
{
if(length <= _staticArr.length)
_arr = _staticArr[0 .. length];
else
_arr = new T[](length);
}
inout(T)[] opSlice() inout pure nothrow
{
return _arr;
}
inout(T)[] opSlice(size_t i, size_t j) inout pure nothrow
{
return _arr[i .. j];
}
inout(T) opIndex(size_t i) inout pure nothrow
{
return _arr[i];
}
@property size_t length() @safe const pure nothrow
{
return _arr.length;
}
private:
T[defaultLen] _staticArr;
T[] _arr;
}
我确信这可以改进,但是它提供了一个示例,当您提前知道阵列需要多少元素时,尝试避免动态分配数组的一种方法。
拥有长度在运行时确定的静态数组的主题最近是discussed in the D newsgroup,语言的创建者Walter Bright认为他们比他们的价值更麻烦,所以我不指望在D中看到这样的特性(虽然我们可能在标准库中得到某种类型的包装类型,它与我在这里的示例类似)。