2011-10-23 2 views
3

J'ai ce qui semble être une question assez simple, mais je voulais juste m'assurer.Pointer vs TType

Y a-t-il une différence entre les deux?

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; 

et

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; 

En raison de la façon dont il travaille quand je joue avec elle, la seule différence est que je ne peux pas voir directement les éléments dans PointerArray (comme seule l'adresse est indiquée).

Merci

+0

Sans rapport avec votre question - Vous devez utiliser 'High()' au lieu de 'Length()' dans 'TMyClass.Create()'. Vous essayez de stocker votre pointeur 'Self' sur le mauvais index de tableau. –

+0

@ RemyLebeau-TeamB ouais, j'utilise habituellement 'PointerArray [Length (PointerArray) -1]: = Self;'. En passant, est-ce différent de la «haute()» en termes de vitesse? –

Répondre

6

Les deux versions sont identiques en termes de code que le compilateur génère. C'est parce qu'une référence d'instance est implémentée comme un pointeur. La différence est que pour la version basée sur des pointeurs, le compilateur ne sait pas que le contenu du tableau est une référence à une instance. C'est pourquoi vous devez convertir en TMyClass afin de pouvoir appeler une méthode, et pourquoi l'insight du débogueur est seulement capable de vous montrer une adresse.

+0

Ouais, je sais pourquoi je ne peux pas voir le contenu de ma classe dans le tableau Pointer. Je voulais juste savoir si elles diffèrent en termes de temps ou de besoins en mémoire, ce que vous avez dit ne pas. Merci –