【问题标题】:Why does `QDateTime` implement implicit sharing?为什么 `QDateTime` 实现隐式共享?
【发布时间】:2019-06-25 19:42:40
【问题描述】:

According to the documentation 隐式共享主要是为了提高性能(避免复制和更改时自动复制)。

为什么它是为QDateTime 类实现的,显然应该只是少量字节?我想说的是,引用计数更新的堆分配和线程同步的成本将大大超过不复制几个字节的小收益。

【问题讨论】:

    标签: c++ performance qt


    【解决方案1】:

    简短的回答:它更便宜。

    长答案:Qt 是围绕PIMPL 模式设计的。创建对象的真实副本意味着您必须为 PIMPL 分配新堆并复制两者。尤其是新分配对于小对象来说是相当昂贵的。为了克服这个问题,他们决定为许多甚至是小类实现写时复制。

    【讨论】:

    • 并非所有的 Qt 都是用 PIMPL 完成的;两个微不足道且相关的反例是QDateQTime,它们是“常规”类,它们的数据直接位于private: 部分。 QDateTime 有什么不同?
    • @MatteoItalia QDate 和 QTime 都不会尝试处理时区,因此它们可以用一个数字完全表示,并且没有真正的理由会改变,所以 PIMPL 非常没用,客观上最好将它们放在堆栈上。 QDateTime 确实处理增加了复杂性的时区。此外,其中肯定至少有一个 QString 来存储时区名称,因此堆分配已经被使用,摆脱它并不是一个巨大的优化。
    • @JosephIreland QDateTime 确实包含一个QTimeZone,但它又是一个基于QSharedDataPointer 的类,它通常是空的(因此,没有分配要做)或者它是一个从其他地方共享副本(并且它是不可变的,因此您不能以任何方式将其分离)。如果 QDateTime 不是基于 dptr 的,那么无论如何都不会有任何堆分配。
    • 我看到的唯一问题是QTimeZone 支持是有条件的,因此如果需要维护 ABI,QDateTime 的 PIMPL(可能包括也可能不包括 QTimeZone)可能有用针对没有时区支持的 Qt 版本编译的应用程序与提供它的库版本之间的兼容性。但是话又说回来,添加一个虚拟的QTimezone 版本是微不足道的。
    • @MatteoItalia 没错,但我猜开发人员认为这些状态标志和夏令时信息足够复杂,足以保证 PIMPL。
    猜你喜欢
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    相关资源
    最近更新 更多