2011-10-23 77 views
3

我有什麼似乎是一個非常基本的問題,但我只是想確定。指針與TType

這兩者之間有區別嗎?

var ClassArray: array of TMyClass; 

constructor TMyClass.Create; 
begin 
    SetLength(ClassArray, Length(ClassArray)+1); 
    ClassArray[Length(ClassArray)-1]:=Self; 
end; 

begin 
    for i:=0 to x do 
    ClassArray[i].MyProcedure; 

var PointerArray: array of Pointer; 

constructor TMyClass.Create; 
begin 
    SetLength(PointerArray, Length(PointerArray)+1); 
    PointerArray[Length(PointerArray)-1]:=Self; 
end; 

begin 
    for i:=0 to x do 
    TMyClass(PointerArray[i]).MyProcedure; 

因爲從它的工作時,我與它玩耍的樣子,唯一不同的是,我不能直接在PointerArray查看元素(如只顯示地址)。

謝謝

+0

與您的問題無關 - 您需要在'TMyClass.Create()'內部使用'High()'而不是'Length()'。您試圖將您的'Self'指針存儲到錯誤的數組索引中。 –

+0

@ RemyLebeau-TeamB是的,我通常使用'PointerArray [Length(PointerArray)-1]:= Self;'。順便說一句,這與速度方面的High()有什麼不同? –

回答

6

這兩個版本在編譯器生成的代碼方面是相同的。這是因爲實例引用是作爲指針實現的。

區別在於,對於基於指針的版本,編譯器不知道數組內容是實例引用。這就是爲什麼你必須投到TMyClass爲了能夠調用一個方法,以及爲什麼調試器的洞察力只能夠告訴你一個地址。

+0

是的,我知道爲什麼我看不到指針數組中的類的內容。我只是想知道他們是否在時間或內存要求方面有所不同,而你說他們沒有。謝謝 –