On peut très bien faire des convertions forcées entre des pointeurs et des entiers dans Delphi. Cela ne pose pas de problème particulier. Le type Tobject qui est un pointeur sur une instance de classe, peut lui aussi être converti en entier, comme le montre l’exemple suivant. Que se passe t-il alors au niveau code machine en ce qui concerne les comparaisons entre deux pointeurs ?
procedure TForm1.Button1Click(Sender: TObject);
var
lst:TStringList;
a:integer;
begin
lst:=TStringList.create;
lst.AddObject('test',TObject(10));
lst.AddObject('test2',TObject(18));
lst.AddObject('test2',TObject(180));
a:=lst.IndexOfObject(TObject(18));
showmessage(IntTostr(a));
lst.Free;
end;
En regardant les sources de IndexOfObject on a :
function TStrings.IndexOfObject(AObject: TObject): Integer; beginfor Result := 0 to GetCount - 1 do
if GetObject(Result) = AObject then Exit;
Result := -1;end;
A partir de ça le compilateur génère le code suivant : (en vu CPU pas à pas dans le code de la méthode IndexOfObject). :
Le compilateur de delphi converti la comparaison entre pointeurs en comparaison entre entiers ( cmp eax,ebp-$08 ). Il compare ici la valeur contenue dans le registre eax ($A, 10 en décimal) qui est la première valeur du tableau Tobject, à la valeur qui se trouve à l’adresse EBP-$08 c’est à dire $12 qui donne 18 en décimal. En fait Delphi ne sait pas faire de différence entre pointeur et entier, tout simplement parce que cette distinction n’existe pas au niveau CPU. C’est pour lui la même chose, tout est entier sur 32 bits. L’apparente différence entre un entier et un pointeur n’est qu’un pur artifice du langage de Delphi.
