Реализовать контейнер, содержащий в себе фиксированный набор объектов, готовых к использованию.
Пул объектов используется:
В пуле объекты создаются / уничтожаются в 2 этапа. Первичная инициализация / деинициализация — это дорогостоящая операция и производится только при создании уничтожении всего пула объектов. Финальная инициализация / деинициализация считается более дешёвой операцией и выполняется непосредственно перед запросом из пула / после возвращения в пул объекта.
В рамках задачи считаем выделение памяти дорогой, а вызов конструктора — дешёвой операцией.
Примерный интерфейс контейнера:
По аналогии с методом std::vector.emplace, процедура запроса должна предусматривать передачу дополнительных параметров, необходимых для окончательной инициализации объекта.
class Point {
int m_x, m_y;
public:
Point() // конструктор без параметров
: m_x(0), m_y(0) {}
Point(int x, int y) // конструктор с параметрами
: m_x(x), m_y(y) {}
};
ObjectPool<Point> pp(10); // выделена память под 10 объектов Point
Point &p1 = pp.alloc(); // сработал конструктор Point()
Point &p2 = pp.alloc(0, 1); // сработал конструктор Point(0, 1)