Завершено
5
22.09.2017, 07:13
10.10.2017, 11:24
Реализовать контейнер, содержащий в себе фиксированный набор объектов, готовых к использованию.
Пул объектов используется:
В пуле объекты создаются / уничтожаются в 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)