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

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

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

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

Сообщение vitya007 » 02.12.2016 10:18:32

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


Код: Выделить всё
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
vitya007
новенький
 
Сообщения: 32
Зарегистрирован: 10.05.2011 22:23:27

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

Сообщение zub » 02.12.2016 12:00:57

В смысле почему не слева?
Краткость конечно сестра таланта, но не до такой же степени))
zub
долгожитель
 
Сообщения: 1959
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение vitya007 » 02.12.2016 12:38:26

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


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

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

Сообщение zub » 02.12.2016 12:45:00

Ок. тебе конечно видней))
zub
долгожитель
 
Сообщения: 1959
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Дож » 02.12.2016 13:10:24

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

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

что слева?

Обычно у людей оперативная память идёт слева направо, а не сверху вниз.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 658
Зарегистрирован: 12.10.2008 16:14:47

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

Сообщение vitya007 » 02.12.2016 13:52:23

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


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

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

Не может, особенно если есть virtual методы.
Не учитываешь наследование. Там могут быть еще переменные, тем самым расширить класс.
vitya007
новенький
 
Сообщения: 32
Зарегистрирован: 10.05.2011 22:23:27

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

Сообщение zub » 02.12.2016 14:22:59

Дож
Как у класса может не быть виртуальных методов если у TObject`а их куча?
zub
долгожитель
 
Сообщения: 1959
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Дож » 02.12.2016 14:29:27

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

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

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

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

«Данный контекст» — это вопрос «Почему VMT внизу?» и кусок ассемблерного кода. В нём не рассматриваются ни структуры, ни таблицы.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 658
Зарегистрирован: 12.10.2008 16:14:47

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

Сообщение zub » 02.12.2016 14:31:32

У всех классов ссылка на vmt хранится по одному смещению, подробностей непомню, но думаю ТС нам сейчас всё раскажет
zub
долгожитель
 
Сообщения: 1959
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение vitya007 » 02.12.2016 14:35:14

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


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

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

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

Сообщение sts » 02.12.2016 14:44:12

замените на
Код: Выделить всё
type
  generic TTestType<T> = class
  private <<<<<<<<<<
   v: T;
  public
   procedure Proc; virtual; abstract;
  end;
 

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

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

Сообщение zub » 02.12.2016 14:48:45

Асм получен с включеными оптимизациями?
zub
долгожитель
 
Сообщения: 1959
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение vitya007 » 02.12.2016 15:09:18

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

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

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


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru