|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
04.11.2011, 10:08 | #1 |
Форумчанин
Регистрация: 03.11.2011
Сообщений: 230
|
Отличие type T = Object от type T = Class?
В чем заключается отличие type T = Object от type T = Class?
|
04.11.2011, 11:47 | #2 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
04.11.2011, 12:18 | #3 |
Форумчанин
Регистрация: 03.11.2011
Сообщений: 230
|
спасибо, но интересно где эта справка? у меня выводиться сообщение об ошибке если, если я выделю ключевое слово в коде и нажимаю Ф1.
теперь понятно что это некая альтернатива. только не понятно object поддерживает наследование как class? object - не поддерживает конструкторы и деструкторы, нужно вызывать new и dispose, но наверное объект описанный как object работает несколько быстрее, поскольку вся эта гирлянда методов с TОbject не тянется как у classa. |
04.11.2011, 12:43 | #4 | ||||||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Код:
Цитата:
Цитата:
Просто в нем нет ничего изначально, ни деструктора, ни конструктора. Так же можно с ними работать как с записями(так же через New/Dispose создавать/удалять) Цитата:
Цитата:
Тем не менее TObject гибче. и еще: Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
||||||
04.11.2011, 13:34 | #5 | |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Справку можно всегда увидеть здесь. В частности: classes and objects.
Ошибка по F1 - смотря какая ошибка. Возможно, справка просто не установлена. object - это устаревшая конструкция, наследуемая Delphi из Borland Pascal-я. Грубо говоря, это записи с методами и наследованием. Весьма ограничены. Кроме того, поскольку эта конструкция оставлена в языке только по соображениям обратной совместимости, то её особо не тестируют и там полно багов. Лучше держаться от них подальше. Основная разница между class и object (помимо более широких возможностей первого): class - это указатель (размещается в куче), object - это запись (размещается на стеке). Цитата:
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
|
04.11.2011, 13:35 | #6 | |
Форумчанин
Регистрация: 03.11.2011
Сообщений: 230
|
Цитата:
вот что из этого получилось, и надо заметить что итераций у объекта больше в среднем в 2 раза. inline - директива несколько помогает выправить ситуацию, но тем не менее перевес по скорости доступа к членам ... на стороне объекта. Код:
Последний раз редактировалось Warn; 04.11.2011 в 13:49. |
|
04.11.2011, 14:00 | #7 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Наивный :-D
Кто ж так делает. Эти два куска кода генерируют почти идентичный машинный код: b1._x:=100; 005107DA C7400464000000 mov [eax+$04],$00000064 b1._y:=50; 005107E1 C7400832000000 mov [eax+$08],$00000032 b1._z:=2; 005107E8 C7400C02000000 mov [eax+$0c],$00000002 b1.GetVolume(); 005107EF E814FFFFFF call CBox.GetVolume b2._x:=100; 00510802 C745F464000000 mov [ebp-$0c],$00000064 b2._y:=50; 00510809 C745F832000000 mov [ebp-$08],$00000032 b2._z:=2; 00510810 C745FC02000000 mov [ebp-$04],$00000002 b2.GetVolume(); 00510817 8D45F4 lea eax,[ebp-$0c] 0051081A E885FFFFFF call OBox.GetVolume Как видим, код на object оказался даже больше на 1 инструкцию. А твоя разница в результатах объясняется тем, что у тебя погрешность изменения больше его точности. 1. Вызов GetTickCount стоит дороже установки свойств и вызова GetVolume. 2. Начало одного цикла может попасть на нечётную границу, а начало второго - на чётную. Вот и получится, что второй цикл будет впереди планеты всей. Но не потому, что его тело быстрее, а потому что само условие цикла быстрее выполняется. Но не будет верно мерять и в инструкциях: далеко не всегда две инструкции выполняются медленнее одной. Машинная оптимизация - дело сложное и неоднозначное. Но самое главное правило тут: "Преждевременная оптимизация - корень всех бед" Не занимайся оптимизацией, пока у тебя нет проблемы. Вот когда будет конкретная проблема - вот тогда её надо будет решать. И решать её надо будет не согласно своим "я думаю, что вот это работает медленно и поэтому я это оптимизирую". Как показывает практика, ты почти всегда будешь не прав. Единственный верный ответ тебе может дать профайлер. А та фигня, которой ты занимаешься, съест у тебя месяцы работы и даст прирост в 1 миллисекунду в час.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
04.11.2011, 14:59 | #8 | |||||||
Форумчанин
Регистрация: 03.11.2011
Сообщений: 230
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Таких программистов мало - это почти герои умственного труда. Надеюсь когда-нибудь вырасту до понимания ассемблера. Цитата:
ну в общем-то да, было бы чего оптимизировать Тут скорее идет попытка разобраться в скоростных хр-ках фундаментальных единиц трансляции языка, что в целом может повлиять на выбор стратегии разработки. И поэтому стратегия типа - пишем процедурно, с кучей ассемблерных вставок, тоже имеет право - быть, если создатели языка хорошо отдохнули когда его создавали. однако, все это я зря и все равно придется пользоваться "тормознымигибкимиклассами" как-нибудь переживу)) |
|||||||
04.11.2011, 19:20 | #9 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
http://www.ozon.ru/context/detail/id/1418882/
http://www.insidepro.com/rus/doc.shtml http://wasm.ru/
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
Последний раз редактировалось GunSmoker; 04.11.2011 в 19:24. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Could not convert variant of type (Olestr) into type (Double) | java_91 | Общие вопросы Delphi | 1 | 18.02.2011 18:46 |
The type name 'GreenShalControl' does not exist in the type | Beton_net | WPF, UWP, WinRT, XAML | 0 | 15.02.2011 11:24 |
Could not convert variant of type (UnicodeString) into type (Double) | postaveche | БД в Delphi | 11 | 13.12.2010 16:41 |
Ошибка " Record, object or class type required " (Запись, объектный или классический тип требовались) | kta87 | Помощь студентам | 2 | 28.02.2010 10:04 |
Record, object or class type required | @mazonk@ | Помощь студентам | 0 | 07.06.2009 13:03 |