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

Jer*_*oen 2 d dynamic-arrays

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

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

Jon*_*vis 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;
}
Run Code Online (Sandbox Code Playgroud)

我确信这可以改进,但是它提供了一个示例,当您不知道数组将需要多少元素时,尝试避免动态分配数组的一种方法.

最近在D新闻组讨论了长度在运行时确定的静态数组的主题,语言的创建者Walter Bright认为他们比他们的价值更麻烦,所以我不希望看到D中的这样一个特性(尽管我们可能在标准库中得到某种类型的包装类型,它类似于我在这里的例子).

  • 如果在传递给函数时对其进行切片,那就可以了. (2认同)