我正在尝试用更轻的替代品( / )QString来代替重的类别。问题是 Qt 小部件无论如何都不会使用这些类。例如,该方法需要作为输入参数,使我的改进毫无用处。QStringRefQStringViewQLabel::setTextconst QString&
我对这种差异感到困惑。这是故意的吗?这有什么理由吗?QStringView如果一天结束时没有人消费它们,那么用例应该是什么?
QString,QStringRef并且QStringView有不同的用例:
QString:Qt 中存储字符串的默认类。它使用隐式共享来避免不需要的(只读)副本。请注意,您可以使用 f.ex有效地构造它。QStringLiteral对于静态字符串:
[...] 对于大多数用途,
QString是您要使用的类。它在整个 Qt API 中使用 [...]
QStringView当您不想存储字符串(并且关心构造 的开销QString)时, : 作为函数参数很有用:
QStringView被设计为接口类型;它的主要用例是作为函数参数类型。当QStringViews 用作自动变量或数据成员时,必须注意确保引用的字符串数据(例如,由 a 拥有QString)在所有代码路径上的寿命都超过QStringView,以免字符串视图最终引用已删除的数据。
如果你想给你的用户最大的自由度,让他们可以将哪些字符串传递给你的函数,如果你存储了字符串的未修改的副本,并且因此想要利用 QString 的隐式共享,请在重载中附带
QStringView重载 [...]QString。
QLabel绝对应该存储text字符串(在绘制事件期间绘制它或实现 getter 函数)。因此,提供QStringView重载不会带来任何改进。
QStringRef: 对于低级字符串解析很有用:
此类旨在提高操作从现有
QString实例获取的子字符串时的子字符串处理性能。通过简单地引用原始字符串的一部分来QStringRef避免标准的内存分配和引用计数开销。QString事实证明,这在低级代码(例如解析器中使用的代码)中是有利的,但代价可能是更复杂的代码。
请注意,仅QString获取字符串的所有权,对于其他两个,程序员应该确保引用的字符串仍然存在。
结论:QString是在 的 接口中使用的正确类QLabel::setText。
进一步阅读