странный метод Tstrings.CheckSpecialChars объясните почему?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

странный метод Tstrings.CheckSpecialChars объясните почему?

Сообщение alexrayne » 27.01.2010 02:04:10

портируя классы фрюхи обратно в дельфу наткнулся в objpas\classes\stringl.inc на такой вот коммент

Код: Выделить всё
{
  For compatibility we can't add a Constructor to TSTrings to initialize
  the special characters. Therefore we add a routine which is called whenever
  the special chars are needed.
}

Procedure Tstrings.CheckSpecialChars;



кто нить пояснит каким боком пострадает совместимость если перекрыть конструктор?
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: странный метод Tstrings.CheckSpecialChars объясните почему?

Сообщение Sergei I. Gorelkin » 27.01.2010 03:35:06

Не перекрыть, а добавить. В TStrings нет конструктора. Если его добавить, то придется и в конструкторы всех возможных потомков добавлять "inherited create", иначе он не будет вызываться.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: странный метод Tstrings.CheckSpecialChars объясните почему?

Сообщение alexrayne » 27.01.2010 09:52:15

А разве он не наследует конструктор от TObject?
ведь и в TStringList конструктора необъявлено, но я четко знаю что могу его создать TStringList.Create
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: странный метод Tstrings.CheckSpecialChars объясните почему?

Сообщение Sergei I. Gorelkin » 27.01.2010 11:13:40

Наследовать-то он наследует, но у TObject конструктор пустой, поэтому далеко не все вызывают inherited в конструкторах своих объектов, если это равносильно вызову TObject.Create.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: странный метод Tstrings.CheckSpecialChars объясните почему?

Сообщение alexrayne » 27.01.2010 16:13:36

сдаецо мне что как раз код невызывающий inherited constructor гесть глюк, ведь нет нигде никакой гарантии что поменяется библиотека над которой наворочены свои классы.
в данном случае получается совместимость с глюками, сугубое имхо.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: странный метод Tstrings.CheckSpecialChars объясните почему?

Сообщение Sergei I. Gorelkin » 27.01.2010 18:34:50

В данном случае вполне нормальное решение - инициализация по мере надобности. Не будь там этого комментария про совместимость - ты бы ничего вообще не заметил :)
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: странный метод Tstrings.CheckSpecialChars объясните почему?

Сообщение alexrayne » 27.01.2010 20:04:07

да вроде как наоборот - люди благодаря етому коменту ничего незамечают, а надо же по идее както их ето заставлять делать.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: странный метод Tstrings.CheckSpecialChars объясните почему?

Сообщение Sergei I. Gorelkin » 27.01.2010 20:21:58

Не нужно никого заставлять. Выкидывание вызовов пустых родительских конструкторов вполне оправдано, потому что такой вызов обходится существенно дороже по быстродействию, чем вызов пустой обычной процедуры. Особенно для легких объектов, которые предполагается создавать пачками.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: странный метод Tstrings.CheckSpecialChars объясните почему?

Сообщение alexrayne » 27.01.2010 20:27:56

он же статический, тобиш должен вызываться как простая процедура, и даже виртуальные методы вызываются быстро по крайней мере Флориан както об етом упоминал, или для конструкторов ето нетак?
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: странный метод Tstrings.CheckSpecialChars объясните почему?

Сообщение Sergei I. Gorelkin » 27.01.2010 21:07:57

Вызываются одинаково, но внутри конструктора (и деструктора тоже) делаются всякие "лишние" действия.
Мы с Флорианом :roll: дорабатывали этот механизм, так что сейчас в FPC создание объектов должно быть пошустрее, чем в Дельфи. Но пустой конструктор по-любому не превращается в один ассемблерный 'ret' .
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: странный метод Tstrings.CheckSpecialChars объясните почему?

Сообщение alexrayne » 27.01.2010 22:14:42

там наверно проверки целостности VMT и проч?
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: странный метод Tstrings.CheckSpecialChars объясните почему?

Сообщение Sergei I. Gorelkin » 27.01.2010 23:24:51

Нет, в случае TObject там вызов NewInstance, тело конструктора внутри try..except, вызов деструктора в случае исключения, вызов AfterConstruction в случае нормального завершения. Ну и проверки на предмет того, чтобы NewInstance и AfterConstruction вызывались по одному разу на объект в случае цепочки унаследованных конструкторов.
Проверки целостности вставляются отдельными вызовами, только при компиляции с соотв. опциями, и, кажется, только для "старых" object-ов.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: странный метод Tstrings.CheckSpecialChars объясните почему?

Сообщение defecator » 28.01.2010 12:42:53

Sergei I. Gorelkin писал(а):Вызываются одинаково, но внутри конструктора (и деструктора тоже) делаются всякие "лишние" действия.
Мы с Флорианом :roll: дорабатывали этот механизм, так что сейчас в FPC создание объектов должно быть пошустрее, чем в Дельфи. Но пустой конструктор по-любому не превращается в один ассемблерный 'ret' .


Гм, а что, оптимизатору разве сложно соптимизировать вызов пустого конструктора, просто выкинув код вызова пустого конструктора ?
Это было бы вполне логично.
defecator
новенький
 
Сообщения: 43
Зарегистрирован: 07.09.2009 10:17:01
Откуда: Подольск

Re: странный метод Tstrings.CheckSpecialChars объясните почему?

Сообщение Sergei I. Gorelkin » 28.01.2010 17:56:25

Не доросли до такого пока еще...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru