Я реализую класс контейнера (ObjectPool). Он поддерживает массив объектов шаблона в непрерывной памяти. При построении он выделяет блок памяти (эквивалентный (размеру объекта шаблона)*(размеру пула)). При добавлении новых объектов в пул он использует оператор «размещение нового» для создания объекта по определенному адресу памяти (и автоматически вызывает конструктор объекта шаблона).
Как мне реализовать метод ObjectPool.add(), чтобы принять объект шаблона и добавить его в пул объектов, не вызывая дважды его конструктор (например, функциональные возможности, реализованные в std::vector.push_back())?
Для простоты в этом случае класс ObjectPool содержит только один объект шаблона вместо массива.
class FooClass
{
public:
FooClass(int p_testValue) : m_testValue(p_testValue)
{
std::cout << "Calling constructor: " << m_testValue << std::endl;
}
int m_testValue;
};
template <class T_Object>
class ObjectPool
{
public:
ObjectPool()
{
// Allocate memory without initializing (i.e. without calling constructor)
m_singleObject = (T_Object*)malloc(sizeof(T_Object));
}
// I have tried different function arguments (rvalue reference here, amongs others)
inline void add(T_Object &&p_object)
{
// Allocate the template object
new (m_singleObject) T_Object(p_object);
}
T_Object *m_singleObject;
};
int main()
{
ObjectPool<FooClass> objPool;
objPool.add(FooClass(1));
}
FooClass(1)
создает временныйFooClass
, поэтому в целом конструктор будет вызываться не менее двух раз. 04.09.2015std::vector.push_back
это делает? Поскольку, если бы я вызывалpush_back
сFooClass(1)
, конструктор вызывался бы только один раз. 04.09.2015