在D中创建一个在编译时未知的静态数组

时间:2013-11-22 20:38:17

标签: d dynamic-arrays

如何在D中创建静​​态数组,在编译时未指定该大小?

immutable ulong arrayLength = getArrayLength();
ubyte[arayLength]; // <- How to do this basically

1 个答案:

答案 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中看到这样的特性(虽然我们可能在标准库中得到某种类型的包装类型,它与我在这里的示例类似)。