Как организовать reference count для классов по быстрому?

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

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

Ответить
Аватара пользователя
Cheb
энтузиаст
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34
Контактная информация:

Как организовать reference count для классов по быстрому?

Сообщение Cheb »

Если кто знает навскидку примеры реализации для mode objfpc + совместимости с fpc 2.6.4. :oops:

Почему не годится TInterfacedObject: он использует InterlockedIncrement, а мне эта убийственно медленная штука - как рыбе зонтик, мне надо для однопоточной системы (или многопоточной, где пулы объектов по любому огорожены критическими секциями, и имеют каждый свой отдельный диспетчер памяти).

Пытался перехватить оператор присваивания, чтобы поднимал исключение в райнтайме и присвоить можно было, только передавая получателя как var параметр методу присваемого экземпляра класса.
Не сработало.

З.Ы. Это я к тому, чтобы под корень вырезать из своей системы сборщик мусора с его кладбищем.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

Cheb писал(а):Почему не годится TInterfacedObject: он использует InterlockedIncrement, а мне эта убийственно медленная штука - как рыбе зонтик, мне надо для однопоточной системы (или многопоточной, где пулы объектов по любому огорожены критическими секциями, и имеют каждый свой отдельный диспетчер памяти)

сейчас набегут и будут спорить, что критические секции тормознее, чем InterlockedIncrement.

может у hinst-а что-нить есть? не зря же он за ARC объекты ратовал.
Аватара пользователя
Cheb
энтузиаст
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34
Контактная информация:

Сообщение Cheb »

, что критические секции тормознее, чем InterlockedIncrement.

Но критическая секция передёргивается один раз на тик игрового мира, а InterlockedIncrement - при *каждом* присваивании.

В принципе, может быть, забить? Использовать TInterfacedObject и сосредоточиться на минимизации в т.ч. количества присваиваний?
Заодно на халяву получу потокобезопасность chepersy, коя где-нигде, а пригодится.

Смотрел InterlockedIncrement для ARM - там совсем ужасы, ассемблерный код с ожиданием в цикле.
sts
энтузиаст
Сообщения: 549
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

Ну дык, раз манипуляции с объектом планируются в рамках одного потока, то и не использовать InterlockedIncrement, наваять свой TInterfacedObject. я так делал, правда в делфе
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

А я и в FPC это делал. В методах _AddRef() и _Release() можно прописать что угодно, хоть вообще отключить подсчет ссылок.
Аватара пользователя
Cheb
энтузиаст
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34
Контактная информация:

Сообщение Cheb »

То есть, как я понимаю, НЕ наследуешь от TInterfacedObject, а создаёшь свой class(TObject,IUnknown) , и в ём - собственные _AddRef() и _Release(), и встроенный в компилятор механизм подсчёта ссылок активируется один чёрт?

Или, наоборот, наследовать от TInterfacedObject и тупо переопределить эти методы?
sts
энтузиаст
Сообщения: 549
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

Cheb писал(а):создаёшь свой class(TObject,IUnknown) , и в ём - собственные _AddRef() и _Release(), и встроенный в компилятор механизм подсчёта ссылок активируется


да

Добавлено спустя 3 минуты 35 секунд:
Re: Как организовать reference count для классов по быстрому?
_AddRef() и _Release() вызываются если переменная типа IInterface (ну или наследники)
Ответить