Рассмотрим следующий код:
class A
{
B* b; // an A object owns a B object
A() : b(NULL) { } // we don't know what b will be when constructing A
void calledVeryOften(…)
{
if (b)
delete b;
b = new B(param1, param2, param3, param4);
}
};
Моя цель: мне нужно максимизировать производительность, которая в этом случае означает минимизацию объема выделения памяти.
Очевидная вещь здесь - изменить B* b;
на B b;
. Я вижу две проблемы с этим подходом:
- Мне нужно инициализировать
b
в конструкторе. Поскольку я не знаю, что будетb
, это означает, что мне нужно передать фиктивные значения в конструктор B. Который, ИМО, уродлив. - В
calledVeryOften()
мне нужно будет сделать что-то вроде этого:b = B(…)
, что неверно по двум причинам:- Деструктор
b
не будет вызываться. - Будет создан временный экземпляр B, а затем скопирован в
b
, тогда будет вызван деструктор временного экземпляра. Копирование и вызов деструктора можно было бы избежать. Хуже того, вызов деструктора вполне может привести к нежелательному поведению.
- Деструктор
Итак, какие решения мне нужно избегать, используя new
? Имейте в виду, что:
- У меня есть только контроль над A. У меня нет контроля над B, и у меня нет контроля над пользователями A.
- Я хочу, чтобы код был чистым и удобным для чтения.