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.

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


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


> просто так   (16.10.08 18:29) [56]


> мне ненужно 50000 разных объектов, нужно 50000 точек


Чудесно.
Возьми да организуй массив структур, описывающих точку.
Нахрен тебе массив объектов-то ? Точка ведь расчудесно описывается структурой..
Нахрен точке методы, да еще и виртуальные ?


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

>>Сергей М.
Я про фому, ты про ерему, тут мне ненужно 50000 разных объектов, нужно 50000 точек. без выделений памяти под каждый объект отдельно. я прекрасно понимаю что под разные объекты в обном массиве без указателей не обойтись
>>sniknik
почитай хылп про objectы, что значит не полноценный vmt? такойже как у классов, только без шушеры по отрицательному смещению


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


> просто так   (16.10.08 16:53) [50]
> точки к примеру


Хорошо.

Создай тем жемакаром массив полиморфныхобъектов ..


sniknik   (2008-10-16 18:03:00) [44]

> Хотя и не полноценный полиморфизм, но иногда может быть полезно.
возможно.

> Одна или не одна - неважно, VMT не цепляется полностью к каждому объекту, просто добавляется указатель на неё.
--->
> посмотри на sizeof(zbasic)
с классами, и "настоящим" vmt согласен на все 100%, но здесь какое то жалкое подобие...
я не зря по sizeof сказал, в примере, с того с которого начинается ветка у меня (D7) sizeof показывает 8 байт (4 под переменную, 4 под "виртуальный" метод), и при том что "виртуальный" метод не инициализирован (nil вмеcто адреса) вызов его нормально работает, как показывал. и что это значит? то что данные в структуре/"vmt" тут при вызове не используются.
а стоит снять "виртуальность"  они и из структуры пропадают (4 байта становиться).

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

var
 a, b, c: zbasic;
 mas: array[0..SizeOf(zbasic)*3] of byte absolute a;
begin
 a.initxywh;
 b.initxywh;
 c.initxywh;
end.


смотри на массив mas при
procedure crash; virtual;
и
test:= Pointer(-1);
очевидно заполнение, и можешь посчитать байты если мне не доверяешь.
после убирай  
procedure crash; //virtual;
и смотри снова. к каждому объекту цепляется или нет.


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

а смысл доделывать рекорд? чтоб получить обжект который нафиг никому не нужен((?
ох уж этот маркетинг


DevilDevil   (2008-10-16 16:59:00) [46]

будем надеяться, что object вернут... или хотя бы доделают record


DevilDevil   (2008-10-16 16:58:00) [47]

> просто так   (16.10.08 13:53) [42]

не трать своего драгоценного времени - они не поймут.

Должна быть OOП-структура с виртуальными методами. + должны быть директивы автоконсруктора/автодеструктора. Это моё мнение.


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

>>Каким поведением отличаются точки, если их рассматривать как объекты - не понятно ..
точки к примеру. подойдет любая структура маленкого размера. в моем случае точка
>>И это будут не статические, а динамические объекты
Я не програмист, и наверно тебя не понимаю, но объект можно создать и статически и динамически в отличае от класса
>>Сути не меняет - все равно конструирование в том или ином виде требуется, иначе нафих вообще вся эта бодяга с объектами..
требуется только при наличии виртуальных методов, без них конструктор в принципе можно не вызывать
>>может он и вписывает, просто как переменную (адрес), но вызовы идут как статические. проверь
в данном примере вызовы оптимизируются до статических, пример только чтоб показать ошибку
>>вот тебе те 4 байта которые ты "экономил" на указателе отказавшись от динамических классов. а если ещё такая процедура не одна...
эти 4 байта присутствуют и в классе, даже больше. я говорил про экономию от массива объектов над массивом указателей на объект
>>И то этот кусок нельзя, допустим, "одним махом" читать/писать из файла, чтобы не испортить указатели на VMT. В общем, структура данных на любителя
Писать одним махом в принципе можно, если забить на выравнивания и при чтении прогонять для всех пустой конструктор. но это да, на любителя
>>Ещё тов. "просто так" следует иметь в виду, что объекты не вполне совместимы с compiler magic типами вроде LongString
вышеуказаный товарисч в курсе)) это не смертельно


Sapersky   (2008-10-16 15:55:00) [49]

может он и вписывает, просто как переменную (адрес), но вызовы идут как статические.

Вызовы "изнутри" объекта динамические. Т.е. если в объекте-родителе есть вызов виртуальной функции, которая замещена в наследнике, вызовется именно функция наследника.
Хотя и не полноценный полиморфизм, но иногда может быть полезно.

а если ещё такая процедура не одна...

Одна или не одна - неважно, VMT не цепляется полностью к каждому объекту, просто добавляется указатель на неё.
Хотя да, экономия по сравнению с TPoint + TList получается сомнительная, преимущество разве в том, что данные лежат "одним куском". И то этот кусок нельзя, допустим, "одним махом" читать/писать из файла, чтобы не испортить указатели на VMT. В общем, структура данных на любителя...

Ещё тов. "просто так" следует иметь в виду, что объекты не вполне совместимы с compiler magic типами вроде LongString (независимо от версии Дельфи). Впрочем, это вполне соответствует статусу "for backward compatibility only", в старом коде никаких LongString нет.


sniknik   (2008-10-16 15:00:00) [50]

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

// a.initxywh;
a.crash;
ShowMessage(IntToStr(integer(a.test)));


и вместо
test:=nil;
записать туда чтото, чтобы было видно
test:= Pointer(-1);

на d7 это работает, что показывает метод crash не виртуальный, вызов как статического/классового.
у тебя это должно дать ошибку, если 2009 "честный".

и кстати, раз ты уж про память объектов заговорил, посмотри на sizeof(zbasic), при стоящим virtual у процедуры, а после убери, и посмотри еще раз. вот тебе те 4 байта которые ты "экономил" на указателе отказавшись от динамических классов. а если ещё такая процедура не одна...


Сергей М.   (2008-10-16 14:49:00) [51]

К тому же нафих тут массив объектов?

Точка она и в африке точка, для ее описания достаточно обычной структуры.

Каким поведениемотличаются точки, если их рассматривать как объекты - не понятно ..


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


> Anatoly Podgoretsky ©   (16.10.08 14:11) [45]


Да хоть бы и статические.
Сути не меняет - все равно конструирование в том или ином виде требуется, иначе нафих вообще вся эта бодяга с объектами..


Anatoly Podgoretsky   (2008-10-16 14:11:00) [53]

> Сергей М.  (16.10.2008 13:58:43)  [43]

И это будут не статические, а динамические объекты


Anatoly Podgoretsky   (2008-10-16 14:05:00) [54]

> просто так  (16.10.2008 13:53:42)  [42]

Опять же смотрим справку

they provide nobuilt-in constructors, destructors, or other methods


Сергей М.   (2008-10-16 13:58:00) [55]


> выделю 1 раз память под массив в куче


Так тебе ж все равно бежать потом в цикле по этому массиву для конструирования каждого элемента !


просто так   (2008-10-16 13:53:00) [56]

>>sniknik
конструктор вписывает адрес vmt в указатель на vmt расположенный в области памяти полей.
>>Сергей М.
выделю 1 раз память под массив в куче.


Сергей М.   (2008-10-16 13:42:00) [57]


> лучше 1 раз память выделю


где, в какой секции ?


sniknik   (2008-10-16 13:38:00) [58]

> абсолютно также как с классом, тотже vmt, все честно, никакого мошенства))
ну да, конечно...
виртуальные методы определяются на этапе создания конструктором. где создание статического объекта? что у него делает "конструктор", если он не "конструирует"?


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

наплимер массив таких точек\классов пожрет дополнительно 50% от своего размера под указатели + создание каждого объекта динамически. незнаю как вас, а меня совесть мучает, я лучше 1 раз память выделю и какнить обойдусь без ссылок.

с рекодами - совесть спокойна, но мозгу хочется плюсов ооп, трудно без наследования, полиморфизма и прочих прелестей


Сергей М.   (2008-10-16 13:12:00) [60]


> делать под него класс? ему будет жирно


Вот я и спрашиваю, почему ему будет жирно, а тебе, напротив, неудобно ?
Конкретные аргументы приводи..


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

Наверх

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