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

时间:2012-07-15 22:38:14

标签: c++ qt4 shared-data qshareddata

我是Qt初学者,需要编写一些数据类。在QSharedDataPointer示例(here)中编写所有这些类是一个好方法,还是这个开销过多(除了它更多的工作)?

我在自然界中的课程非常类似于下面的Employee课程。我将不得不处理数百个实例,而不是数万或数百万。

我使用QSharedData / QShareDataPointer的动机是简化手动内存管理并具有通用代码样式。但我仍然不确定是否会监督一些警告。

来自example

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;
 };

1 个答案:

答案 0 :(得分:5)

执行QSharedDataPointer / pImpl习惯用法的优点是:

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

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

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

但是,对于您的个人计划,您不太可能看到很多好处。如果您的数据对象与EmployeeData示例类中显示的数据对象一样小(或者即使它们比那些大10或100倍),那么仅复制数据的开销可能会很小......因为您可以随时重新编译自己的代码库,所以向后兼容性优势对您来说并不重要。

所以我的建议是保持简单,只做标准的C ++方式,在必要时制作成员对象的常规旧的default-copy-constructor样式副本(并在可能的情况下通过const-reference将对象传递给方法) ,以尽量减少他们被复制的次数)。如果您注意到可测量的性能问题,那么您可以返回并使用pImpl / QSharedDataPointer重写一些类,以查看它是否为您提供了可测量的加速(尽管您可能会发现它不会)。 / p>