Какие данные TObject содержит?

 new String("0") === new String("0")

Здесь вы сравниваете две разные строки, имеющие разные ссылки. Вот почему вы получаете ложь.

 o === o

Здесь вы фактически сравниваете одну и ту же строку (в этом случае ссылка одна и та же).

8
задан Mason Wheeler 25 March 2009 в 18:54
поделиться

3 ответа

В Delphi 2009 существует способность иметь ссылку на монитор синхронизации. См.:

class function TMonitor.GetFieldAddress(AObject: TObject): PPMonitor;
class function TMonitor.GetMonitor(AObject: TObject): PMonitor;

... в System.pas

Кроме того, существует все еще указатель на VMT. (Таблица виртуальных методов.) От Delphi вкратце:

Класс TObject объявляет, что несколько методов и одно специальное, скрытое поле хранят ссылку на класс объекта. Это скрытое поле указывает на таблицу виртуальных методов (VMT) класса. Каждый класс имеет уникальный VMT, и все объекты того класса совместно используют VMT класса.

12
ответ дан 5 December 2019 в 12:13
поделиться

Объект содержит записи для всех своих полей плюс дополнительное пространство для содержания указателя на таблицу виртуальных методов. VMT содержит больше, чем просто указатели виртуального метода. Я объясняю больше о VMT на моем веб-сайте, включая схему.

По-видимому, Delphi 2009 представляет другое скрытое поле в дополнение к указателю VMT для содержания монитора синхронизации. Можно определить, добавляется ли это вначале или в конце класса с некоторым простым кодом:

type
  TTest = class
    FField: Integer;
  end;

var
  obj: TTest;
  ObjAddr, FieldAddr: Cardinal;
begin
  Assert(TTest.InstanceSize = 12);
  obj := TTest.Create;
  ObjAddr := Cardinal(obj);
  FieldAddr := Cardinal(@(obj.FField));
  writeln(FieldAddr - ObjAddr);
end.

Если это печатает значение 4, то поле монитора должно быть в конце объекта потому что 4 только счета на размер указателя VMT. Если это печатает значение 8, то поле монитора должно быть в запуске, смежном с указателем VMT.

Я ожидаю, что Вы найдете монитор в запуске. Иначе это означает, что расположение объекта-потомка не является просто расположением базового объекта со всеми новыми добавленными полями. Это означало бы, что смещение поля монитора зависит от типа выполнения объекта, и это делает реализацию более сложной.

Когда класс реализует интерфейс, структура объекта включает более скрытые поля. Поля содержат указатели на интерфейсно-ссылочное значение объекта. Когда Вы имеете IUnknown ссылка на объект, указатель это, хранения не являются тем же как указателем на поле VMT объекта, которое является тем, что Вы имеете с обычной ссылкой на объект. IUnknown значение указателя будет адресом скрытого поля. Я записал больше о расположении классов той реализации интерфейсы.

3
ответ дан 5 December 2019 в 12:13
поделиться

На всякий случай кто-то задается вопросом, почему Craig Stuntz' ответ был accpepted, см. его последний комментарий к тому ответу:

Похож был добавлен в D2009: http://blogs.embarcadero.com/abauer/2008/02/19/38856 Видит ссылки в том сообщении для полного изложения.

Ссылка, больше не доступная, но Wayback Machine, имеет его:

https://web.archive.org/web/20160409224957/blogs.embarcadero.com/abauer/2008/02/19/38856

-1
ответ дан 5 December 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: