Что лучше? Вернуть список указателей объектов? или вернуть указатель на список объектов? - PullRequest
0 голосов
/ 29 января 2020

У меня есть код, который читает Продукты из базы данных и возвращает их в виде списка.

std::list<Product> findAll() {...}

Код выше (CRUD) является частью библиотеки (сторонней библиотеки). Код клиента получает список и передает его в 3 слоя (MVC). Я знаю, что этот процесс копирует список при каждом вызове.

Я хочу улучшить этот процесс, и возникают следующие вопросы: Получение списка

  • Должен ли я создать список указателей Продукта и вернуть это. std::list<Product*> products;
  • Или я должен создать указатель на список продуктов и вернуть его. std::list<Product> *productsPtr;

Что эффективнее? Вернуть список указателей продукта или вернуть указатель на список. Я знаю, что современные компиляторы имеют RVO . Как я могу использовать эту функцию? . Потому что я использую clang-v5.0.0 и отправляю выходные данные на экран. Я видел, что продукты создаются и уничтожаются каждый раз (копия).

И еще несколько вопросов. Что лучше ?:

  • Библиотека должна возвращать список объектов Product (текущее состояние)? или список указателей продукта (интеллектуальные указатели) или получить ссылку на список в качестве параметра?
  • Класс продукта должен реализовывать конструкторы перемещения , чтобы гарантировать RVO?

Подробнее.

  • Класс продукта имеет конструктор по умолчанию. Его информация (идентификатор, имя, цена и т. Д. c.) Заполняются установщиками и получателями.
  • Список в основном используется для отображения в таблицах. Однако список должен передаваться из библиотеки в модель, затем в контроллер и, наконец, в представление. Представление позволяет добавлять, обновлять и удалять товары. Вот причина моего вопроса.
  • Мне нравится идея использовать std::vector, потому что улучшить доступ к данным.

Но мои главные сомнения здесь: вернуть контейнер (список, вектор , et c) из простых объектов или указателей или указатель на контейнер?.

1 Ответ

0 голосов
/ 29 января 2020

Если вы используете C ++ 11 или выше (что вам следует), возвращение std::list<Product> является лучшим вариантом, поскольку копирование не будет.

Если вы используете более старый C ++, вы должен, вероятно, передать выходной параметр std::list<Product>&. Использование списка указателей не является ни эффективным, ни удобным, и оно также вызовет копию на указателях - это может быть лучше, чем копирование всего продукта, но это все еще ненужная копия.

Кстати, если вас беспокоит эффективность, вам, вероятно, следует использовать вектор (если вы не уверены, что вам это не нужно).

О RVO (C ++ 11 или выше) - если вы возвращаете неконстантный объект из функция, она использует свой конструктор перемещения вместо копирования данных. Существует концепция исключения копирования - если вы возвращаете только что созданный

Например:

return std::vector{1,2,3,4,5};

Компилятор создаст объект на месте для возвращенного значения.

Примечание - исключение копии является частью стандартного выделенного текста как для C ++ 17.

...