Arhn - архитектура программирования

ссылки rvalue с новым размещением (функции аналогичны std::vector.push_back)

Я реализую класс контейнера (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));
}

Ответы:


1

Если вы берете T_Object&&, это должно ссылаться на уже построенный T_Object, а затем вам нужно создать новый объект в вашем хранилище, так что это еще один вызов конструктора.

Вам нужно что-то вроде emplace_back:

template<class... Args>
void emplace(Args&&... args)
{
    // Allocate the template object
    ::new (static_cast<void*>(m_singleObject)) T_Object(std::forward<Args>(args)...);
}

Назовите это как objPool.emplace(1).

Кстати, версия add, принимающая T_Object&& p_object, должна создавать содержащийся объект из std::move(p_object).

04.09.2015
  • Спасибо за ответ. Я добавил метод void emplace(), и его вызов сработал отлично. Я видел этот метод в контейнере std::vector, когда просматривал push_back, однако я не полностью понял синтаксис. Есть ли способ реализовать это, чтобы я мог вызвать его с помощью (FooClass(1)) вместо просто (1)? 04.09.2015
  • @ПолА. У вас не может быть и того, и другого. FooClass(1) создает временный FooClass, поэтому в целом конструктор будет вызываться не менее двух раз. 04.09.2015
  • Как std::vector.push_back это делает? Поскольку, если бы я вызывал push_back с FooClass(1), конструктор вызывался бы только один раз. 04.09.2015
  • @ПолА. Я сомневаюсь в этом, если вы не правильно оснастили конструкторы. 04.09.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..