【发布时间】:2019-06-25 19:42:40
【问题描述】:
According to the documentation 隐式共享主要是为了提高性能(避免复制和更改时自动复制)。
为什么它是为QDateTime 类实现的,显然应该只是少量字节?我想说的是,引用计数更新的堆分配和线程同步的成本将大大超过不复制几个字节的小收益。
【问题讨论】:
标签: c++ performance qt
According to the documentation 隐式共享主要是为了提高性能(避免复制和更改时自动复制)。
为什么它是为QDateTime 类实现的,显然应该只是少量字节?我想说的是,引用计数更新的堆分配和线程同步的成本将大大超过不复制几个字节的小收益。
【问题讨论】:
标签: c++ performance qt
简短的回答:它更便宜。
长答案:Qt 是围绕PIMPL 模式设计的。创建对象的真实副本意味着您必须为 PIMPL 分配新堆并复制两者。尤其是新分配对于小对象来说是相当昂贵的。为了克服这个问题,他们决定为许多甚至是小类实现写时复制。
【讨论】:
QDate 和QTime,它们是“常规”类,它们的数据直接位于private: 部分。 QDateTime 有什么不同?
QDateTime 确实包含一个QTimeZone,但它又是一个基于QSharedDataPointer 的类,它通常是空的(因此,没有分配要做)或者它是一个从其他地方共享副本(并且它是不可变的,因此您不能以任何方式将其分离)。如果 QDateTime 不是基于 dptr 的,那么无论如何都不会有任何堆分配。
QTimeZone 支持是有条件的,因此如果需要维护 ABI,QDateTime 的 PIMPL(可能包括也可能不包括 QTimeZone)可能有用针对没有时区支持的 Qt 版本编译的应用程序与提供它的库版本之间的兼容性。但是话又说回来,添加一个虚拟的QTimezone 版本是微不足道的。