首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该将我的所有数据类实现为QSharedData并与QSharedDataPointer一起使用吗?

我应该将我的所有数据类实现为QSharedData并与QSharedDataPointer一起使用吗?
EN

Stack Overflow用户
提问于 2012-07-16 06:38:14
回答 1查看 3.5K关注 0票数 5

我是一个Qt初学者,需要写一些数据类。像QSharedDataPointer示例(here)那样编写所有这些类是不是一个好的方法,或者这是不是太多的开销(除了它更多的工作之外)?

我的类在本质上与下面的Employee类非常相似。我将不得不处理几百个实例,而不是一万或数百万个实例。

对我来说,使用QSharedData / QShareDataPointer的一个动机是简化手动内存管理并拥有通用的代码风格。但我仍然不确定我是否监督了一些警告。

example

代码语言:javascript
复制
class EmployeeData : public QSharedData
 {
 public:
     EmployeeData();
     EmployeeData(const EmployeeData &other);
     ~EmployeeData();

     int id;
     QString *name;
 };

 class Employee
 {
 public:
     Employee();
     Employee(int id, const QString &name);

     void setId(int id) { d->id = id; }
     void setName(const QString &name);

     int id() const { return d->id; }
     QString name() const;

 private:
     QSharedDataPointer<EmployeeData> d;
 };
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-16 13:12:24

使用QSharedDataPointer/pImpl惯用法的好处是:

1)在某些情况下,您可以避免某些数据复制(例如,如果您有两个或更多相同的Employee对象,它们可以共享相同的EmployeeData后端,而不是每个对象都有自己的相同数据的单独副本)

2)向EmployeeData类添加额外的数据字段后,只需要重新编译Employee类的源代码,因为只有Employee类(假设)会直接访问EmployeeData类。您的所有其他代码将(可能)仅访问Employee类,因此不需要重新编译,因为Employee类的大小和布局不会改变。

在适当的情况下,这两个原因都是令人信服的--例如,Qt本身从pImpl和许多地方的隐式共享中受益,因为Qt需要极其高效地处理大量数据,更重要的是,因为Qt与第三方开发人员的关系要求它保证新的Qt共享库版本将保持向后兼容现有的第三方应用程序可执行代码,这些代码是针对旧的Qt版本编译的。

然而,对于你的个人程序来说,你不太可能看到太多的好处。如果您的数据对象像EmployeeData example类中所示的一样小/简单(或者即使它们比它大10倍或100倍),那么仅仅复制数据的开销可能会很小……而且,由于您可以在需要时重新编译自己的代码库,因此向后兼容性的好处对您来说并不重要。

因此,我的建议是保持简单,只用标准的C++方式来做事情,在必要时制作成员对象的常规旧的默认复制构造函数样式的副本(并在可能的情况下通过const-reference将对象传递给方法,以最小化它们被复制的次数)。如果您曾经注意到一个可测量的性能问题,那么您可以返回并使用pImpl/QSharedDataPointer重写一些类,看看它是否给您带来了可测量的加速比(尽管您可能会发现它不会)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11496228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档