О: template
class deepcopy_smart_pointer
2 : {
private:
T* mjpObject;
public:
// ... другие функции
7:
8: // конструктор копий указателя глубокого копирования
19 Зак. 3626
578 ЗАНЯТИЕ 26. Понятие интеллектуальных указателей
deepcopy_smart_pointer (const deepcopy_smart_pointer& source)
10: {
// Clone() виртуальная: гарантирует глубокое копирование
объекта производного класса
m_pObject = source->Clone ();
}
14:
// Оператор присвоения копии
deepcopy_smart_pointer& operator= (const deepcopy_smart_pointer& source)
{
if (m_pObject)
delete m_pObject;
2 0 :
m_pObject = source->Clone ();
}
23:
24: };
Анализ
Как можно заметить, класс d e e p c o p y _ s m a r t _ p o in t e r реализует конструктор копий
строках 9-13. Он обеспечивает глубокое копирование полиморфного объекта при по мощи функции C lo n e ( ) , которую должен реализовать объект. Точно так же он реализует оператор присвоения копии в строках 16-22. Для простоты в этом примере подразумева ется, что виртуальная функция C lo n e () реализована базовым классом F is h . Как правило, интеллектуальные указатели, реализующие модель глубокого копирования, получают эту функцию либо как параметр шаблона, либо как объект функции.
Таким образом, когда сам интеллектуальный указатель передается как указатель на базовый класс F is h , часть C a r p не отсекается:
deepcopy_smart_ptr freshWaterFish(new Carp); MakeFishSwim (freshWaterFish); // Carp не будет 'отсечен'
Глубокое копирование, реализованное в конструкторе интеллектуального указателя, обеспечивает передачу объекта без отсечения, даже при том, что синтаксически функции M a k e F is h S w im () требуется только его базовая часть.
Недостаток механизма глубокого копирования в низкой производительности. Для не которых приложений это не проблема, но во многих других случаях потеря производи тельности могла бы воспрепятствовать программисту задействовать интеллектуальный указатель в его приложении. Вместо этого он мог бы просто передать такой функции, как M a k e F is h S w im ( ), указатель базового класса (обычный указатель F is h * ) . Другие ссылоч ные типы пытаются решать эту проблему производительности иными способами.
Механизм копирования при записи
Копирование при записи (Copy on W rite — COW ) — одна из попыток оптимизиро вать производительность интеллектуальных указателей глубокого копирования за счет совместного использовании указателей до первой попытки записи объекта. При первой
Типы интеллектуальных указателей
|
579
|
попытке вызова не константной функции указатель COW, как правило, создает копию объ екта, для которого вызвана непостоянная функция, тогда как другие экземпляры указателя продолжат совместно использовать исходный объект.
Указатели COW широко распространены и имеют множество приверженцев. Поклон ники указателей COW полагают реализацию операторов (*) и (-> ) в их константных и не константных версиях ключевой функциональной возможностью указателя COW. Копию создает последняя.
Дело в том, что, выбирая реализацию указателя в соответствии с философией COW, следует убедиться в понимании подробностей его реализации, прежде чем перейти к его использованию. В противном случае вы можете оказаться в ситуации, где копий будет или слишком мало, или слишком много.
Do'stlaringiz bilan baham: |