Я пытаюсь реализовать очередь, в которой вы передаете ей объект, который нужно добавить в очередь.
struct Node {
T data;
Node *next, *prev;
};
// Push data to the back of the list.
template <class T> T& CircularQueue<T>::push_back(const T&& new_data)
{
Node* new_node = new Node();
new_node->data = std::move(new_data);
link_node(new_node, m_head);
return new_node->data;
}
Проблема с моим текущим подходом в том, что слишком много накладных расходов (когда я от C меня сие беспокоит). например изображение, я добавлю объект из MyClass:
CircularQueue<MyClass> list;
list.push_back(MyClass(arg1, arg2));
Первая проблема заключается в том, что MyClass должен иметь конструктор без аргументов, который будет использоваться в Node* new_node = new Node();
, поскольку создание структуры Node вызовет конструктор объекта внутри него - MyClass. Я пробовал использовать std :: vector, и этого не требовалось.
Вторая проблема - слишком много накладных расходов, list.push_back(MyClass(arg1, arg2));
создаст объект rvalue в стеке, а затем отправит его на push_back
, затем он создаст новый объект (без списка аргументов) в куче, затем переместите все его элементы в новый объект, используя присвоение перемещения, есть ли более быстрое решение?