gpt4 book ai didi

c++ - 我是否应该将所有数据类实现为 QSharedData 并将其与 QSharedDataPointer 一起使用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:51 26 4
gpt4 key购买 nike

我是一名 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;
};

最佳答案

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

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

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

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

但是,对于您的个人计划,您不太可能看到太多好处。如果您的数据对象与 EmployeeData 示例类中所示的对象一样小/简单(或者即使它们比它大 10 倍或 100 倍),则仅制作数据拷贝的开销可能会很小......并且因为您大概可以在需要时重新编译自己的代码库,所以向后兼容的好处对您来说并不重要。

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

关于c++ - 我是否应该将所有数据类实现为 QSharedData 并将其与 QSharedDataPointer 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11496228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com