Класс-не наследник tObject
Модератор: Модераторы
Класс-не наследник tObject
Реален ли сабж на FPC?
Эмммм.....А как такое может быть ?
Вообще, хотелось бы иметь memory layout как у object'а - VMT+указатели на виртуальные методы, без таблицы интерфейсов, имён методов и проч. Подозреваю, что никак. 
-
Павел Ишенин
- постоялец
- Сообщения: 475
- Зарегистрирован: 24.03.2007 09:16:52
Насколько я понял objcclass что-то похожее на то что вы просите. Правда я с этими структурами не работал и могу сильно ошибаться.
>>Вообще, хотелось бы иметь memory layout как у object'а
а сам object не устраивает?
а сам object не устраивает?
Сам object и использую, только крышечки иногда выглядят не в тему 
Может есть способ для объектов, распределённых в куче, обойтись без явного разыменования указателя, то есть использовать foo.Width вместо foo^.Width?
Может есть способ для объектов, распределённых в куче, обойтись без явного разыменования указателя, то есть использовать foo.Width вместо foo^.Width?
runewalsh писал(а):Вообще, хотелось бы иметь memory layout как у object'а - VMT+указатели на виртуальные методы, без таблицы интерфейсов, имён методов и проч.
чего ради... "экономии памяти"?
Ну, во-первых, объекты мне более симпатичны.
А во-вторых, если, в классе заведомо не будут использоваться, ну там, message'ы, интерфейсы, is-as и т. п., то разумно (имхо) их не поддерживать. И, хотя это не принципиально - да, объекты быстрее, особенно создание и уничтожение, + экономия памяти.
М. б. фичи, поддерживаемые благодаря наследованию от tObject, являются частью концепции классов в Object Pascal? Но, например, в C++ у классов нет общего предка, и сделать такое в Free Pascal было бы по крайней мере интересно.
А во-вторых, если, в классе заведомо не будут использоваться, ну там, message'ы, интерфейсы, is-as и т. п., то разумно (имхо) их не поддерживать. И, хотя это не принципиально - да, объекты быстрее, особенно создание и уничтожение, + экономия памяти.
М. б. фичи, поддерживаемые благодаря наследованию от tObject, являются частью концепции классов в Object Pascal? Но, например, в C++ у классов нет общего предка, и сделать такое в Free Pascal было бы по крайней мере интересно.
runewalsh писал(а):А во-вторых, если, в классе заведомо не будут использоваться, ну там, message'ы, интерфейсы, is-as и т. п., то разумно (имхо) их не поддерживать.
вообще это забота компилятора
кстати, программисты C++ по-всякому изгаляются, когда им нужен функционал as и is
runewalsh писал(а):И, хотя это не принципиально - да, объекты быстрее, особенно создание и уничтожение, + экономия памяти.
а есть ли замеры (тесты) по "быстродействию"?
и есть ли замеры по экономии памяти?!
есть ли такая задача, где использование классов, ну никак не подходит, но нужно что-то ООП-шное?!
имхо: тут есть некая фобия, необоснованная боязнь высокоуровневых конструкций языка (страх потери в скорости и объёмах памяти). Точно так же, как тру-программисты не используют тип String или динамические массивы.
Программистов Java и .Net такие вещи, например, не смущают
Но я НЕ призываю runewalsh использовать классы, и, тем более, переписывать уже готовый и отлаженный код.
// Конечно, я страдаю этим (^object вместо class) только в своих проектах. 
Может быть, но зачем неявно наследовать все классы от TObject? Всё равно, что наследовать все интерфейсы от IUnknown, даже если я не собираюсь создавать COM-интерфейс. Последнее в FPC решается сменой модели интерфейсов на CORBA, тогда у интерфейсов не будет общего предка, по идее, нечто похожее можно сделать и с классами...
Набросал, в аттаче.
Эмм, ну, в теории, лишних 80 байт на VMT всё-таки
Нет... Я не против классов, просто, скажем, какому-нибудь tVector3D, и не только ему, большая часть функциональности TObject не нужна.
Скажите наконец кто-нибудь, что такого FPC не умеет, по крайней мере пока, чтобы я успокоился.
скалогрыз писал(а):необоснованная боязнь высокоуровневых конструкций языка
Может быть, но зачем неявно наследовать все классы от TObject? Всё равно, что наследовать все интерфейсы от IUnknown, даже если я не собираюсь создавать COM-интерфейс. Последнее в FPC решается сменой модели интерфейсов на CORBA, тогда у интерфейсов не будет общего предка, по идее, нечто похожее можно сделать и с классами...
скалогрыз писал(а):а есть ли замеры (тесты) по "быстродействию"?
Набросал, в аттаче.
скалогрыз писал(а):и есть ли замеры по экономии памяти?!
Эмм, ну, в теории, лишних 80 байт на VMT всё-таки
скалогрыз писал(а):есть ли такая задача, где использование классов, ну никак не подходит, но нужно что-то ООП-шное?!
Нет... Я не против классов, просто, скажем, какому-нибудь tVector3D, и не только ему, большая часть функциональности TObject не нужна.
Скажите наконец кто-нибудь, что такого FPC не умеет, по крайней мере пока, чтобы я успокоился.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось runewalsh 06.06.2010 15:35:10, всего редактировалось 1 раз.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
runewalsh писал(а):Эмм, ну, в теории, лишних 80 байт на VMT всё-таки
80 байт на класс. Расход на экземпляр - 1 указатель (4 или 8 байт в зависимости от платформы). В случае с object размер VMT плюсуется к каждому экземпляру, если я правильно понимаю, и время инициализации каждого экземпляра растет в зависимости от размера этой самой VMT.
Появление class как раз и ставило задачей уйти от этой зависимости.
runewalsh писал(а):Скажите наконец кто-нибудь, что такого FPC не умеет, по крайней мере пока, чтобы я успокоился.
Не умеет. Успокойся
Sergei I. Gorelkin писал(а):В случае с object размер VMT плюсуется к каждому экземпляру, если я правильно понимаю, и время инициализации каждого экземпляра растет в зависимости от размера этой самой VMT
А вот и нет. Как и для классов, в object memory layout первые 4/8 байт - указатель на VMT, и она не копируется для каждого экземпляра - п. 8.2.12 Programmer's Guide
Sergei I. Gorelkin писал(а):Не умеет
Спасибо
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
runewalsh писал(а):А вот и нет. Как и для классов, в object memory layout первые 4/8 байт - указатель на VMT, и она не копируется для каждого экземпляра - п. 8.2.12 Programmer's Guide
Да, там действительно только указатель на VMT, только расположен не в начале, а в конце, причем не так-то просто определить, где именно: http://bugs.freepascal.org/view.php?id=16034
Тогда мне становится интересно, из-за чего создание object оказывается (по результатам приложенного теста, на моем компьютере на 15%) быстрее, чем class. Теоретически должно быть одно и то же... Надо будет поисследовать на досуге...
runewalsh писал(а):Нет... Я не против классов, просто, скажем, какому-нибудь tVector3D, и не только ему, большая часть функциональности TObject не нужна.
лично моё решение:
Код: Выделить всё
TVector3D = record x,y,z: single; end;
естественно, сейчас прибежит куча людей и скажет: "а вот нету методов в рекордах у FPC!" (new-delphi не совместимость, кстати!).
на что у меня давно приготовлена библиотека с разнообразными функциями и процедурами, вида:
Код: Выделить всё
procedure v3dSomeMath(var v1,v2: TVector3d)
procedure v3daSomeMath(var v: array of TVector3D)
отсутствие каких-либо VMT и разыменовываний, делают код и "компактным" (ура 0<N<1024-byte сэкономил!
Кроме того, такой код работает и на FPC и на Delphi одинаково. (Delphi уж очень остерегается использовать object-ы)
>>лично моё решение:
>>TVector3D = record x,y,z: single; end;
>>естественно, сейчас прибежит куча людей и скажет: "а вот нету методов в рекордах у FPC!"
Иногда хочется еще иметь наследование. оно в delphi для record`ов не появилось?
object`ы не поддерживают, из record`ов делают object`ы. нафига?
главные плюсы object`а - возможность создания не в куче и наследование. это не record не class не заменит
>>TVector3D = record x,y,z: single; end;
>>естественно, сейчас прибежит куча людей и скажет: "а вот нету методов в рекордах у FPC!"
Иногда хочется еще иметь наследование. оно в delphi для record`ов не появилось?
object`ы не поддерживают, из record`ов делают object`ы. нафига?
главные плюсы object`а - возможность создания не в куче и наследование. это не record не class не заменит
