Почему VMT внизу?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
vitya007
новенький
Сообщения: 32
Зарегистрирован: 10.05.2011 22:23:27

Почему VMT внизу?

Сообщение vitya007 »

В общем по сабжу


Код: Выделить всё

program test;

type
  generic TTestType<T> = class
   v: T;
  public
   procedure Proc; virtual; abstract;
  end;
 
  TTestTypeSpec = specialize TTestType<Single>;
 
procedure Test(v: TTestTypeSpec);
begin
   v.v := 123;
   v.Proc;
end;

exports
   Test;
   
begin

end.


Код: Выделить всё

| mov edx,dword ptr ds:[409000]
| mov dword ptr ds:[eax],edx
| mov edx,dword ptr ds:[eax+4]
| call dword ptr ds:[edx+30]
| ret
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

В смысле почему не слева?
Краткость конечно сестра таланта, но не до такой же степени))
vitya007
новенький
Сообщения: 32
Зарегистрирован: 10.05.2011 22:23:27

Сообщение vitya007 »

zub писал(а):В смысле почему не слева?
Краткость конечно сестра таланта, но не до такой же степени))


что слева? название тем прочти. знающие люди поймут о чем речь. Прошу не писать, если не знаешь.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Ок. тебе конечно видней))
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

VMT может быть в любом месте, у этого нет какой-то необходимости.

Скорее всего для того, чтобы было похоже на object'ы. Если у object'а нет виртуальных методов, у него нет и VMT, и потому он совместим в памяти с аналогичным record'ом. Если в нём в будущем появляется VMT, оно появится в конце и данные продолжат быть совместимы.

что слева?

Обычно у людей оперативная память идёт слева направо, а не сверху вниз.
vitya007
новенький
Сообщения: 32
Зарегистрирован: 10.05.2011 22:23:27

Сообщение vitya007 »

Дож писал(а):Обычно у людей оперативная память идёт слева направо, а не сверху вниз.


В данном контексте рассматривалась как структура, ее можно рассматривать как таблицу.

Дож писал(а):VMT может быть в любом месте, у этого нет какой-то необходимости.

Не может, особенно если есть virtual методы.
Не учитываешь наследование. Там могут быть еще переменные, тем самым расширить класс.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Дож
Как у класса может не быть виртуальных методов если у TObject`а их куча?
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

zub писал(а):Дож
Как у класса может не быть виртуальных методов если у TObject`а их куча?

Да, я тупанул, забыл, что все классы являются неявными наследниками TObject'ов. Похоже, что VMT у класса всегда хранится где-то в начале инстанса.

Интересный тред по теме:
viewtopic.php?f=14&t=3628

В данном контексте рассматривалась как структура, ее можно рассматривать как таблицу.

«Данный контекст» — это вопрос «Почему VMT внизу?» и кусок ассемблерного кода. В нём не рассматриваются ни структуры, ни таблицы.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

У всех классов ссылка на vmt хранится по одному смещению, подробностей непомню, но думаю ТС нам сейчас всё раскажет
vitya007
новенький
Сообщения: 32
Зарегистрирован: 10.05.2011 22:23:27

Сообщение vitya007 »

zub писал(а):У всех классов ссылка на vmt хранится по одному смещению, подробностей непомню, но думаю ТС нам сейчас всё раскажет


VMT всегда находятся в 0x00 смещении, их кстати может быть несколько если это интерфейсы и используют несколько классов.

Тема еще акутальна
sts
энтузиаст
Сообщения: 549
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

замените на

Код: Выделить всё

type
  generic TTestType<T> = class
  private <<<<<<<<<<
   v: T;
  public
   procedure Proc; virtual; abstract;
  end;
 

каков результат будет?
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Асм получен с включеными оптимизациями?
vitya007
новенький
Сообщения: 32
Зарегистрирован: 10.05.2011 22:23:27

Сообщение vitya007 »

zub писал(а):Асм получен с включеными оптимизациями?

Без разницы какие оптимизации.

Но если интересно O4
Ответить