其中兩種類型是相似的(事實上相同)。第三不是。
在tarray被聲明爲 「陣列字節的」,因爲是TB的。您錯過了另一個非常相關的類型,但是,TByteArray(PByteArray引用的類型)。
作爲一個指針TByteArray,PByteArray,嚴格來說是一個指向一個靜態字節數組,而不是一個動態陣列(其中其它字節數組類型都是)。它以這種方式輸入,以便允許使用整數索引引用該基址指針的偏移量。並且請注意,此索引僅限於2^15元素(0..32767)。用於從一些基指針任意字節偏移(> 32767),一個PByteArray是沒有好處:
var
b: Byte;
ab: TArray<Byte>;
pba: PByteArray;
begin
SetLength(ab, 100000);
pba := @ab; // << No cast necessary - the compiler knows (magic!)
b := pba[62767]; // << COMPILE ERROR!
end;
即鑄造陣列字節的或在tarray到PByteArray潛在地要導致數組有> 32K個元素的問題(並且指針被傳遞給一些嘗試訪問所有元素的代碼)。投射到一個無類型的指針當然可以避免這種情況(只要指針的「接收者」然後通過指針恰當地處理對內存引用的訪問)。
但是,這些都不會在未來發生變化,這只是實施細節早就應用於此領域的一個後果。引入語法加糖的泛型類型聲明是笛子紅。
實際上,你錯了......一個「字節數組」不是一個字節數組...它是一個指向字節的動態數組的指針,它是引用計數和長度管理的(非常像字符串)。我想知道的是:就向前兼容性而言,這對於將類型字符串轉換爲PChar是否對於PByteArray類型TBytes(或TArray)是安全的。 –
2010-03-11 19:23:29
「字節數組」**是**字節數組。唯一的區別是,它表現爲運行時主要作爲*引用類型*,而不是*值類型*(如靜態數組的情況)。當然,編譯器知道這一點,並且將(以及應該)以類似於String <> PChar(通常稱爲「編譯器魔術」)的相同方式來處理類型轉換(即通常依賴於編譯器的代碼生成意識到它是自己的內部)。 – Deltics 2010-03-11 19:38:35
@Ken:好的,我明白你的意思了。編輯我的回覆。 – 2010-03-11 19:48:28