如何在D中創建一個靜態數組,其大小在編譯時沒有指定?在D中創建一個在編譯時不知道的靜態數組
immutable ulong arrayLength = getArrayLength();
ubyte[arayLength]; // <- How to do this basically
如何在D中創建一個靜態數組,其大小在編譯時沒有指定?在D中創建一個在編譯時不知道的靜態數組
immutable ulong arrayLength = getArrayLength();
ubyte[arayLength]; // <- How to do this basically
簡短的回答:你不知道。靜態數組的大小在編譯時總是已知的。如果你想要一個大小在運行時確定的數組,那麼它需要是一個動態數組。
較長的答案:如果你想自己煮點東西,你可以使用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中的這樣一個特性(雖然我們可能會在標準庫中得到某種類型的包裝類型,它與我在這裏的例子類似)。
這是否允許在需要類型[x]的函數中使用數組,其中x是編譯時已知的數字? –
如果在傳遞給函數時切片,那將起作用。 –
@JeroenBollen正如亞當所說,如果你切片,那麼你可以傳遞它,因爲那樣你就會使用動態數組,並且你可以將動態數組的內容複製到靜態數組中,但是你必須保留記住你只能複製和靜態數組一樣多的數據,所以如果x小於動態數組中的數據量,那麼你將無法傳遞所有數據。 –
不可變將不會在那裏工作,因爲您將無法更改內容 –
如果您解釋「靜態」的含義,這將有所幫助。你能舉一個更長的例子嗎? – gmfawcett
@gmfawcett它不能修改大小,並且可以用作非動態數組。 –