2011-10-23 4 views
3

私はかなり基本的な質問であると思うが、私はちょうど確かめたい。ポインタ対TType

これらの2つの違いはありますか?

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()'の中で 'Length()'の代わりに 'High()'を使う必要があります。 'Self'ポインタを間違った配列インデックスに格納しようとしています。 –

+0

@ RemyLebeau-TeamBええ、私は通常、 'PointerArray [Length(PointerArray)-1]:= Self;'を使います。ちなみに、これはスピードという点で、 'High()'とは違いますか? –

答えて

6

2つのバージョンは、コンパイラが生成するコードの点で同一です。これは、インスタンス参照がポインタとして実装されているためです。

違いは、ポインタに基づくバージョンでは、コンパイラは配列の内容がインスタンス参照であることを認識しません。そのため、メソッドを呼び出せるようにするためにはTMyClassにキャストする必要があります。また、デバッガの洞察ではあなたにアドレスを表示できるのはなぜですか。

+0

ええ、私はなぜ私のクラスの内容をポインタ配列で見ることができないのか分かります。私はちょうど彼らがあなたが言わなかった時間や記憶の要求の点で異なっているかどうかを知りたがっていました。ありがとう –

関連する問題