什么更好?返回对象指针列表?或返回指向对象列表的指针?
What's better? Return a list of object pointers? or Return a pointer to list of objects?
我有一个代码,可以从数据库中读取产品并将它们作为列表返回。
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。
相关文章:
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 从封装在对象中的函数 C++ 返回时为空的列表
- 如何在不销毁对象的情况下返回对象列表
- 如何使用Q_PROPERTY公开自定义对象列表
- 链接列表在 cpp 中包含不同的对象类
- 如何使用对象制作分数列表并获得平均值
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 我可以从列表中获取对象并复制它们,但如何删除我复制的对象?
- 如何获取列表的每个对象并调用getName方法来打印其名称
- 如何在Windows Media Foundation SDK中指定语言列表对象
- 在 DLL 中嵌入 Python:Py_DECREF列表对象时访问冲突读取位置
- 将类的每个实例添加到列表对象的构造函数
- 列表<对象*>迭代器中的分段错误
- 如何使用list::sort()对STL列表对象进行排序,同时将自定义排序函数作为参数传递给list::排序
- 如何防止客户端修改列表对象
- c++列表对象错误
- 在列表对象中使用对象的派生函数
- 编译器错误 使用列表<对象*的迭代器> C++