什么更好?返回对象指针列表?或返回指向对象列表的指针?

What's better? Return a list of object pointers? or Return a pointer to list of objects?

本文关键字:列表 对象 指针 返回 什么 更好      更新时间:2023-10-16

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

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

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

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

  • 我是否应该创建一个产品指针列表并返回它。std::list<Product*> products;
  • 或者我应该创建一个指向产品列表的指针并返回它。std::list<Product> *productsPtr;

什么更有效率?返回产品指针列表或返回指向列表的指针。 我知道现代编译器有RVO。如何使用该功能?因为,我正在使用 clang-v5.0.0 并将输出发送到屏幕,我看到每次都会创建和销毁产品(复制(。

还有一些问题。什么更好?

  • 库应该返回产品对象列表(当前状态(?或产品指针列表(智能指针(或接收列表引用作为参数?
  • 产品类必须实现移动构造函数以保证 RVO?

更多信息。

  • 产品类具有默认构造函数。它的信息(ID,名称,价格等(由二传手和获取者填充。
  • 该列表主要用于显示在表格上。但是,列表必须从库传递到模型,然后传递到控制器,最后传递到视图。该视图允许添加、更新和删除产品。这就是我提问的原因。
  • 我喜欢使用std::vector的想法,因为改善了数据访问。

但我在这里的主要疑问是:返回普通对象的容器(列表、向量等(或指针或指向容器的指针?

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

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

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

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

例如:

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

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

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