Язык С++ |
По последним данным, на рынке продается по крайней мере 2 768 942 книги о С++, не говоря уже о всевозможных курсах, обучающих программах, журналах и семинарах с коктейлями. И все же в этом изобилии наблюдается удручающее однообразие. |
| |
|
Добро пожаловать на сайт студии Web-дизайна "САР" |
Материалы книги получены с http://www.itlibitum.ru/
Оптимизация объема
Другое решение - реорганизация структур данных для сокращения издержек, связанных с хранением незаблокированных ConstPtr (хотя и ценой некоторой потери скорости). ConstPtr лишь незначительно отличается от указателей только для чтения, которые рассматривались в главе 6 и не имели ничего общего с транзакциями: он имеет ссылку на ConstPtr и функцию Lock(). Мы избавимся от первого и внесем некоторые изменения во второе.
Представьте себе глобальную структуру данных (вероятно, хранящуюся в виде статического члена класса Transaction), в которой находится информация о том, какие Transaction блокируют какие ConstPtr. Для каждой пары в таблице содержится соответствующий LockPtr. Каждый раз, когда вызывается функция Lock() класса ConstPtr, она проверяет, присутствует ли this в таблице. Если присутствует, функция сравнивает транзакцию, переданную в качестве аргумента, с находящейся в таблице. Если ConstPtr не находит себя в таблице, он включает в нее новый триплет (ConstPtr, Transaction, LockPtr), а если находит с другой транзакцией - инициирует исключение.
Такая схема оказывается более экономной, чем описанная выше; она не тратит память на значения NULL для всех незаблокированных объектов. Разумеется, она сложенее и медленнее работает - структура данных еще только разогревает двигатель на старте, а косвенной обращение через переменную класса уже пересекает финишную черту.
Возможно, у вас возник вопрос - а почему функция Lock() должна оставаться с ConstPtr? Почему ее нельзя включить в другой класс или даже сделать глобальной функцией? Если мы избавимся от переменной LockPtr* и функции Lock(), ConstPtr превратится в самый обычный указатель только для чтения, который на вопрос о транзакциях лишь тупо смотрит на вопрошающего. Впрочем, так ли это? LockPtr по-прежнему приходится объявлять другом; следовательно, хотя бы тривиальных изменений не избежать. Более того, Transaction не знает конкретный тип указываемого объекта и потому не может использовать шаблон LockPtr для создания объекта блокировки. Если вы еще не забыли, абстрактный базовый класс Lock создавался именно для этой цели. Увы. Нам хотелось бы оставить ConstPtr в счастливом неведении… но не суждено.
Назад Содержание Далее
| |
Специальное предложение |
- Регистрация доменного имени в зоне .net.ru или .pp.ru (1 год)
- Хостинг (1 год)
- Готовый дизайн
- Поддержка РНР
- 3 страницы сайта (главная, о фирме, контакты)
- Регистрация в 256 поисковых системах и каталогах
- Форма сообщений
|
|
Размещение объявлений |
Недорого предлагаем разослать ваше рекламное предложение о товарах или услугах на сотни досок объявлений по всему Рунету. |
|
Язык С++ |
Просматривать полку книг о С++ в книжном магазине ничуть не интереснее, чем литературу по бухгалтерии. В сущности, все книги пересказывают одно и то же и отличаются разве что по весу и количеству цветов в диаграммах и таблицах.
|
|
|