Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

object`ы в delphi 2009


Страницы:   1 2 3 4 5

просто так ©   (2008-10-13 21:08:00) 

Ктонибудь компилировал в D2009 проги использующие object`ы?

В конструкторе при вызове objsetup почемуто портятся поля объекта и походу указатель на vmt. далее при вызове любого виртуального метода AV.

Это глюк или так и надо?


oxffff   (2008-10-16 23:51:00) [21]


> просто так   (16.10.08 23:48) [76]


Не пустой предок, а прекод с виртуальным методом. Что зафиксировать смещение VMT в 0.


просто так   (2008-10-16 23:48:00) [22]

>>Сделай так.
т.е. пустой предок? непомогло, помогает только всё собрать в один файл


oxffff   (2008-10-16 23:24:00) [23]


> oxffff ©   (16.10.08 23:21) [74]


Слава богу, что хороший DRUM&BASS радует душу.


oxffff   (2008-10-16 23:21:00) [24]


> просто так  


Писать в QC смысла нет, поскольку там администрируют реальные дятлы, им объяснишь в чем проблема, они скажут только проблема не зафиксирована.

Например я писал, что невиртуальный вызов GetEnumerator виртуального метода в конструкции for in. Сказали мы не видим проблемы. Но ... поправили в будущих версиях.

Писал им про потенциальные утечки памяти при многократном вызове конструктора record. Сказали мы не видим проблемы. Не знаю поправили или нет сейчас. Вообщем забил я на QС и на всю их команду.
Дятлы одним словом. Честно наболело.


oxffff   (2008-10-16 23:01:00) [25]


> просто так   (16.10.08 20:51) [69]
> >>oxffff
> а из [1]? c пределениями в разных файлах?


Да действительно есть проблема.
Она заключается в том, что при инициализации экземпляра в метаклассе не корректно содержится информация о смещении VMT в экземпляре.
В метаклассе отступ +0 от начала экземпляра, а при вызове используется отступ +4(где соответственно мусор).

НО!!!

Чуть чуть шаманства и твоя проблема решена.

Сделай так.

   zBase=object
   procedure EmptyVirtual;virtual;
   end;

   zgui=object(zBase)

  { zBase }
  procedure zBase.EmptyVirtual;
  begin
 //
 end;

Аплодисменты!!! Занавес!!!!


просто так   (2008-10-16 21:17:00) [26]

>>Только лишь ради проверки твоей блажи ?
не, чтоб не быть голословным


GrayFace   (2008-10-16 21:07:00) [27]

просто так   (16.10.08 20:51) [69]
Да сколько можно? любой случай большого массива маленьких данных. рекорды мне неудобны по причине отсутствия поддержки рекордов с методами в fpc и delphi < 2007.

Столько, сколько нужно чтобы получить ответ. Тогда лучше делать условную компиляцию с object'ами для старых версий и record'ами для новых.


Сергей М.   (2008-10-16 21:03:00) [28]


> просто так   (16.10.08 20:05) [63]


Только лишь ради проверки твоей блажи ?
А оно мне надо ?)


просто так   (2008-10-16 20:51:00) [29]

>>oxffff
а из [1]? c пределениями в разных файлах?
>>GrayFace
Да сколько можно? любой случай большого массива маленьких данных. рекорды мне неудобны по причине отсутствия поддержки рекордов с методами в fpc и delphi < 2007. виртуальные методы в примере только чтобы показать ошибку


oxffff   (2008-10-16 20:46:00) [30]

Динамическое создание

var
   pd:^ADerived;
begin

new(pd,create);
dispose(pd);

d2009 полет нормальный. Буду после 22-00.


oxffff   (2008-10-16 20:31:00) [31]


> просто так   (13.10.08 21:08)  


12.0.3155.16733.

Полет нормальный.

ABase=object
procedure abc;virtual;abstract;
end;

PABase=^ABase;

ADerived=object(ABase)
procedure abc;virtual;
constructor create;
end;

{ ADerived }

procedure ADerived.abc;
begin
showmessage('ADerived');
end;

constructor ADerived.create;
begin
inherited;
//Do nothing
end;

procedure TForm2.FormCreate(Sender: TObject);
var a:ADerived;
   p:PABase;
begin
p:=@a;
a.create;
p.abc;
end;


GrayFace   (2008-10-16 20:17:00) [32]

просто так, и все-таки когда нужны object'ы (плохи record'ы с классами)?


Sapersky   (2008-10-16 20:14:00) [33]

и то что эти байты не цепляются ко всем объектам это ты не подумав сказал...

Я несколько другое говорил:

VMT не цепляется полностьюк каждому объекту

т.е. о том, что размер объекта не зависит от кол-ва виртуальных функций в нём. Мне показалось, что здесь вы утверждали обратное:

вот тебе те 4 байта которые ты "экономил" на указателе отказавшись от динамических классов. а если ещё такая процедура не одна...

Пример дин. вызова со статическим объектом у меня приблизительно такой:

 TMyObject = object
   i : Integer;
   constructor Create;
   destructor Destroy; virtual;
   procedure DoSmth; virtual;
 end;

 TMySecObj = object (TMyObject)
   procedure DoSmth; virtual;
 end;

constructor TMyObject.Create;
begin
DoSmth; // здесь вызовется DoSmth от TMySecObj через VMT
end;

Var mo : TMySecObj;
begin
mo.Create;

Полагаю, что при динамическом создании объектов "внешние" вызовы виртуальных функций у них тоже будут динамическими. Иначе непонятно, зачем в книгах по Турбо-Паскалю употреблялось слово "полиморфизм" :)


GrayFace   (2008-10-16 20:14:00) [34]

В D2006, похоже, тоже VMT у объектов не инициализируется. SizeOf вообще мусор возвращает. И property в объектах еще в D7 не работали, в D2006, правда, не проверял.

Sapersky   (16.10.08 15:55) [49]
Вызовы "изнутри" объекта динамические. Т.е. если в объекте-родителе есть вызов виртуальной функции, которая замещена в наследнике, вызовется именно функция наследника.
Хотя и не полноценный полиморфизм, но иногда может быть полезно.

Полиморфизм, вроде, полноценный. Если передавать ссылку, пытается вызвать виртуально.

Сергей М. ©   (16.10.08 18:51) [57]
Нахрен точке методы, да еще и виртуальные ?

Обычные методы, безусловно, нужны. Например, свойство Length.

sniknik ©   (16.10.08 19:32) [61]
а вот то что я вижу, и примерами пытаюсь "донести", адрес записывается как переменная, и при вызове не используется. (в 2009м возможно уже не так)
это полноценно?

Дак подебаж и все увидешь - записывается адрес VMT, а не метода. Не используется только когда это не нужно - если тип объекта очевиден.
Посмотри SizeOf у этого:
type
 TA = object
   q:integer;
   function aaa:int; virtual;
   procedure bbb; virtual;
 end;


просто так   (2008-10-16 20:05:00) [35]

>>Сергей М.
прежде чем так категорично заявлять, я бы на вашем месте качнул 2009 и проверил))


просто так   (2008-10-16 20:03:00) [36]

Уважаемый sniknik, данный метод 100% виртуальный, то что вы этого не увидели - или не туда смотрели или (менее вероятно) происки оптимизатора. VMT для обжектов - хранит адреса виртуальных методов и инициализируется при компиляции. ссылка на vmt которая добавляется к полям объекта при первом появлении виртуального метода - инициализируется конструктором (адрес vmt передается конструктору в регистре edx при вызове)


sniknik   (2008-10-16 19:32:00) [37]

> что значит не полноценный vmt?
а вот то что я вижу, и примерами пытаюсь "донести", адрес записывается как переменная, и при вызове не используется. (в 2009м возможно уже не так)
это полноценно?

> только без шушеры по отрицательному смещению
так эта "шушера" реально будет только один раз для класса, см.
Sapersky   (16.10.08 15:55) [49]
где он про vmt пишет. это как раз к классам относится.


Сергей М.   (2008-10-16 19:26:00) [38]

Нет там ошибки. Тебе уже сказали про "честность" в  Д2009.


просто так   (2008-10-16 19:15:00) [39]

Серега. топик про ошибку в обжектах, а не про убеждения меня что мне нужно, что ненужно


Сергей М.   (2008-10-16 18:54:00) [40]


> под разные объекты в обном массиве без указателей не обойтись


Ну а чтоже ты тогда тычешь свою точку в кач-ве примера ?


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо