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

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

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

Ответить
alexrayne
постоялец
Сообщения: 125
Зарегистрирован: 03.12.2008 15:56:26

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

Сообщение alexrayne »

портируя классы фрюхи обратно в дельфу наткнулся в 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;



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

Сообщение Sergei I. Gorelkin »

Не перекрыть, а добавить. В TStrings нет конструктора. Если его добавить, то придется и в конструкторы всех возможных потомков добавлять "inherited create", иначе он не будет вызываться.
alexrayne
постоялец
Сообщения: 125
Зарегистрирован: 03.12.2008 15:56:26

Сообщение alexrayne »

А разве он не наследует конструктор от TObject?
ведь и в TStringList конструктора необъявлено, но я четко знаю что могу его создать TStringList.Create
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Наследовать-то он наследует, но у TObject конструктор пустой, поэтому далеко не все вызывают inherited в конструкторах своих объектов, если это равносильно вызову TObject.Create.
alexrayne
постоялец
Сообщения: 125
Зарегистрирован: 03.12.2008 15:56:26

Сообщение alexrayne »

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

Сообщение Sergei I. Gorelkin »

В данном случае вполне нормальное решение - инициализация по мере надобности. Не будь там этого комментария про совместимость - ты бы ничего вообще не заметил :)
alexrayne
постоялец
Сообщения: 125
Зарегистрирован: 03.12.2008 15:56:26

Сообщение alexrayne »

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

Сообщение Sergei I. Gorelkin »

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

Сообщение alexrayne »

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

Сообщение Sergei I. Gorelkin »

Вызываются одинаково, но внутри конструктора (и деструктора тоже) делаются всякие "лишние" действия.
Мы с Флорианом :roll: дорабатывали этот механизм, так что сейчас в FPC создание объектов должно быть пошустрее, чем в Дельфи. Но пустой конструктор по-любому не превращается в один ассемблерный 'ret' .
alexrayne
постоялец
Сообщения: 125
Зарегистрирован: 03.12.2008 15:56:26

Сообщение alexrayne »

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

Сообщение Sergei I. Gorelkin »

Нет, в случае TObject там вызов NewInstance, тело конструктора внутри try..except, вызов деструктора в случае исключения, вызов AfterConstruction в случае нормального завершения. Ну и проверки на предмет того, чтобы NewInstance и AfterConstruction вызывались по одному разу на объект в случае цепочки унаследованных конструкторов.
Проверки целостности вставляются отдельными вызовами, только при компиляции с соотв. опциями, и, кажется, только для "старых" object-ов.
defecator
новенький
Сообщения: 43
Зарегистрирован: 07.09.2009 10:17:01
Откуда: Подольск

Сообщение defecator »

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


Гм, а что, оптимизатору разве сложно соптимизировать вызов пустого конструктора, просто выкинув код вызова пустого конструктора ?
Это было бы вполне логично.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Не доросли до такого пока еще...
Ответить