[翻译]理解Qt容器:STL VS QTL(三)——类型系统 和其他处理

接上文翻译,说明在上文:[翻译]理解Qt容器:STL VS QTL(二)——迭代器

QTypeInfo

我们同样需要说下类型系统来去最优化使用Qt容器,除非你不想为你自己的类型去优化效率和内存占用:QTypeInfo.

QTypeInfo 是一个Traits Class ,为大多数Qt容器去开启已知的优化。

QTypeInfo 为你自己的类型指定的接口是:Q_DECLARE_TYPEINFO( Type, Flags ),为你自己的Type去指定一个属性。

两个因QTypeInfo去优化的是为POD类型(指定Flags = Q_PRIMITIVE_TYPE)和可以直接使用std::memcpy()去代替复制构造的类型(Flags = Q_MOVABLE_TYPE),我们可以看到这是后者真正的区别在Qt容器中,特别是在QList中。

但是,我们什么时候去为你的类型定义Q_PRIMITIVE_TYPE 或者Q_MOVABLE_TYPE呢?(第三个Flags 是Q_COMPLEX_TYPE,这个是默认类型,你不需要特意去指定,除非你不想别人去指定其他类型。)

  •  Q_PRIMITIVE_TYPE 对于所有POD(在 C++03检测) 类型。简化理解,POD也就是将作为C类型编译: 内置类型、 C数组和结构体。(Qt5帮助文档上说:没有构造/析构函数,每一个复制实例都需要使用 memcpy()去创建)
  • Q_MOVABLE_TYPE  这个适用于大多数类,可以移动的类型,可以再内存中重新定位,但是类的内容不会变。(这儿使用了移动,但是这和C++11的move语义是完全不同的),这对绝大多数类型是可以使用的。一个不能使用这个类型的例子是 :pimpl用法的类(Q-D指针)。如果公共类移动了位置,但是q-pointer指向的还是旧的位置。值得欣慰的是,这些类一般不直接作为容器的成员,只是他们指针作为成员(当然其指针类型是Q_PRIMITIVE_TYPE)。(Qt5帮助文档上说:类型具有构造/析构函数,但是可以用memcpy()进行移动。)