【问题标题】:What's better? Return a list of object pointers? or Return a pointer to list of objects?什么更好?返回对象指针列表?或返回指向对象列表的指针?
【发布时间】:2020-05-15 06:05:35
【问题描述】:

我有一个从数据库中读取产品并将它们作为列表返回的代码。

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

上面的代码 (CRUD) 是库(第三方库)的一部分。 客户端代码获取列表并将其传递到 3 层 (MVC)。 我知道这个过程会在每次通话时复制列表。

我想改进这个过程,问题是:获取列表

  • 我是否应该创建一个 Product 指针列表并返回它。std::list&lt;Product*&gt; products;
  • 或者我应该创建一个指向产品列表的指针并返回它。 std::list&lt;Product&gt; *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


【解决方案1】:

如果您使用的是 C++11 或更高版本(您应该这样做),返回 std::list&lt;Product&gt; 是更好的选择,因为不会进行任何复制。

如果您使用的是较旧的 C++,您可能应该传递一个输出参数 std::list&lt;Product&gt;&amp;。使用指针列表既不高效也不舒适,它也会调用指针上的副本——它可能比复制整个产品更好,但它仍然是不必要的副本。

顺便说一句,如果效率困扰您,您可能应该使用向量(除非您确定不需要)。

关于 RVO(C++11 或更高版本) - 如果您从函数返回非常量对象,它会使用其移动构造函数而不是复制数据。 有一个复制省略的概念——如果你返回一个新构建的

例如:

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

编译器将为返回值就地构造对象。

注意 - 与 C++17 一样,复制省略是标准强调文本的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    相关资源
    最近更新 更多