【发布时间】:2020-05-15 06:05:35
【问题描述】:
我有一个从数据库中读取产品并将它们作为列表返回的代码。
std::list<Product> findAll() {...}
上面的代码 (CRUD) 是库(第三方库)的一部分。 客户端代码获取列表并将其传递到 3 层 (MVC)。 我知道这个过程会在每次通话时复制列表。
我想改进这个过程,问题是:获取列表
- 我是否应该创建一个 Product 指针列表并返回它。
std::list<Product*> products; - 或者我应该创建一个指向产品列表的指针并返回它。
std::list<Product> *productsPtr;
什么更有效?返回 Product 指针列表或返回指向列表的指针。 我知道现代编译器有 RVO。 如何使用该功能?。因为,我正在使用 clang-v5.0.0 并将输出发送到屏幕上,我看到每次都会创建和销毁产品(副本)。
还有一些问题。有什么更好的?:
- 库应该返回产品对象列表(当前状态)?或产品指针列表(智能指针)或接收列表引用作为参数?
- 产品类必须实现移动构造函数以保证 RVO?
更多信息。
- 产品类具有默认构造函数。它的信息(id、名称、价格等)由 setter 和 getter 填充。
- 列表主要用于在表格中显示。但是列表必须从库传递到模型,然后传递到控制器,最后传递到视图。该视图允许添加、更新和删除产品。这就是我提出问题的原因。
- 我喜欢使用
std::vector的想法,因为它可以改善数据访问。
但我的主要疑问是:返回普通对象或指针的容器(列表、向量等)还是指向容器的指针?
【问题讨论】:
-
Product到底是什么?它有非平凡的复制构造函数吗? -
Products 的所有者是谁?这个Products 列表将如何使用?访问模式是什么? -
旁注:您确定要在此处使用
std::list吗?lists 可能非常慢。改用std::vector可能会获得所需的所有性能。 -
我通常会发现返回一个简单的对象容器是最好的解决方案,除非你的分析器告诉你这样做会破坏性能。顺便说一句;列表可能是您可以使用的最低效的数据结构。 我的第一个更改可能是改用
std::vector。 -
如果您对性能感兴趣,那么您肯定已经测量了速度。您的哪个选项最快?
标签: c++ performance optimization rvo