![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
object`ы в delphi 2009
просто так © (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]
> делать под него класс? ему будет жирно
Вот я и спрашиваю, почему ему будет жирно, а тебе, напротив, неудобно ?
Конкретные аргументы приводи..