+7 (495) 229-0436   shopadmin@itshop.ru 119334, г. Москва, ул. Бардина, д. 4, корп. 3
 
 
Вход
 
 
Каталог
 
 
Подписка на новости
Новости ITShop
Windows 7 и Office: Новости и советы
Обучение и сертификация Microsoft
Вопросы и ответы по MSSQLServer
Delphi - проблемы и решения
Adobe Photoshop: алхимия дизайна
 
Ваш отзыв
Оцените качество магазина ITShop.ru на Яндекс.Маркете. Если вам нравится наш магазин - скажите об этом Google!
 
 
Способы оплаты
 
Курс расчета
 
 1 у.е. = 92.51 руб.
 
 Цены показывать:
 
 
 
 
  
Новости, статьи, акции
 

Почему я вызываю TRttiContext.Create() и TRttiContext.Free()

21.12.2009 15:02

Я считаю, что нужно сделать перерыв между статьями, для того, что бы объяснить, почему я вызываю TRttiContext.Create() и TRttiContext.Free(), хотя фактически можно этого не делать.

Да, вам не обязательно это делать, хотя я это делаю… Почему?

Прежде всего, давайте посмотрим на обе реализации.

 
class function TRttiContext.Create: TRttiContext;
begin
 Result.FContextToken := nil;
end;

procedure TRttiContext.Free;
begin
 FContextToken := nil;
end;

На первый взгляд здесь нет ничего специфического, значение FContextToken установлено NIL в обоих случаях.
Однако, что же делает установка NIL для FContextToken фактически?
Мы все прекрасно знаем, что Delphi на текущий момент не имеет никакого сборщика мусора (Специальный код, называемый сборщиком мусора (garbage collector), периодически освобождает память, удаляя объекты, которые уже не будут востребованы приложением - то есть производит сборку мусора, прим. переводчика). Следовательно, наличие различных RTTI библиотек, которые основываются на Объектах, может быть проблематичным.
В своем коде я имею возможность делать такие крутые вещи как
c.GetType().GetField().FieldType.ToString

Без необходимости установки временных значений для каждого возвращаемого объекта, что бы высвободить его.
Как это возможно без сборщика мусора?
"Под капотом" вы найдете TRttiPool, который содержит все RTTI объекты, которые уже созданы.
Когда этот пул высвобождается, все созданные в процессе вызовов RTTI объекты также высвобождаются.
Создание и уничтожение в этом пуле контролируется TPoolToken , являющимся Интерфейсом, который хранится в FContextToken.
Когда TPoolToken создан и высвобожден, обеспечивается поддержка PoolRefCount. И когда PoolRefCount принимает нулевое значение, TRttiPool высвобождается.

И так, почему вызывается .Create() и .Free()?

Давайте начнем с .Create()

Это не призыв вызывать данный код, связанный с дополнительными усилиями. Да, несомненно, запись управляема и, как таковая она будет инициализирована, но при этом FContextToken будет содержать избыточность. Давайте разберемся… Хотя я не собираюсь каждый раз создавать указатель на TRttiContext, такой подход дает возможность не занимать предполагаемый объем памяти до тех пор, пока вы не вызовете .Create.
Я так же не могу быть уверен, что реализация будет оставаться простой. Очень вероятно, что здесь будет вызываться дополнительный код. Сохраните мой код для себя, и в будущем вы сможете раскритиковать мой подход.

Переходим к .Free()

Я хочу оставить свое размещение памяти (memory foot print) чистым. Несомненно, когда переменная TRttiContext выходит за рамки обычного поведения это произойдет.
В самом начале своих опытов с RTTI, я ненароком получил access violation в деструкторе наследника TCustomAttribute. При вызове .Free() было легче увидеть, в чем заключалась проблема, чем при получении этого события после деструкии объекта, в котором TRttiContext был объявлен как поле.
И что бы отсечь тривиальные комментарии… Да, я знаю, что документация гласит, что вам не нужно вызывать .Free(). Так же предполагается, что данная технология важна, потому что она обеспечивает то, что RTTI объекты являются кэшируются и используются повторно, это будет справедливо для TRttiContext, описанного как глобальная переменная, что мне кажется очень плохой идеей.
Я думаю, что вместо этого вам следует хранить TRttiContext до тех пор, пока вам это нужно, но высвобождать его в корректное время.
Вкратце… Я считаю, что это личное дело каждого.

Ссылки по теме

  
Помощь
Задать вопрос
 программы
 обучение
 экзамены
 компьютеры
Бесплатный звонок
ICQ-консультанты
Skype-консультанты

Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 
Бестселлеры
Курсы обучения "Atlassian JIRA - система управления проектами и задачами на предприятии"
Microsoft Windows 10 Профессиональная 32-bit/64-bit. Все языки. Электронный ключ
Microsoft Office для Дома и Учебы 2019. Все языки. Электронный ключ
Курс "Oracle. Программирование на SQL и PL/SQL"
Курс "Основы TOGAF® 9"
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год. Электронный ключ
Курс "Нотация BPMN 2.0. Ее использование для моделирования бизнес-процессов и их регламентации"
 

О нас
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.

На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям.

Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе.

В нашем магазине вы можете приобрести лицензионное ПО выбрав необходимое из широкого спектра и ассортимента по самым доступным ценам. Наши менеджеры любезно помогут определиться с выбором ПО, которое необходимо именно вам. Также мы проводим учебные курсы. Мы приглашаем к сотрудничеству учебные центры, организаторов семинаров и бизнес-тренингов, преподавателей. Сфера сотрудничества - продвижение бизнес-тренингов и курсов обучения по информационным технологиям.



 

О нас

 
Главная
Каталог
Новинки
Акции
Вакансии
 

Помощь

 
Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 

Способы оплаты

 

Проекты Interface Ltd.

 
Interface.ru   ITShop.ru   Interface.ru/training   Olap.ru   ITnews.ru  
 

119334, г. Москва, ул. Бардина, д. 4, корп. 3
+7 (495) 229-0436   shopadmin@itshop.ru
Проверить аттестат
© ООО "Interface Ltd."
Продаем программное обеспечение с 1990 года