【问题标题】:QList children - struct or custom classes derived from QObject?QList children - 从 QObject 派生的结构或自定义类?
【发布时间】:2011-04-30 19:12:37
【问题描述】:

我目前正在 Symbian 平台上开发 Qt 应用程序。应用程序有一个 sqlite 数据库,初始数据是从 txt 文件填充的。

我正在从 json 格式的数据中实现在线更新。所以我想在我的 db 更新类中创建通用函数,它接受 QList 的类/结构并从中更新 db。 QList 将填充来自 txt 或 json 的对象。

我已经有了解析,只是考虑在性能方面什么会更好:

  1. 创建 c++ 结构并传递它们(因为对象只包含简单数据)包装在 QList
  2. 创建派生自QObject 的自定义类并将它们作为指针传递给QList,然后使用qDeleteAll 删除所有内容
  3. 任何其他方式...

【问题讨论】:

    标签: c++ qt symbian qlist


    【解决方案1】:

    这取决于你的类是携带行为还是仅携带状态。

    1. 它们带有行为。

      然后,一个多态类是有序的,是的。是否需要继承QObject 是另一个问题。如果您需要它的服务(自省、信号/槽、事件处理),QObject 继承。否则,不要。

      至于qDeleteAll():我不会去那里。代替裸指针,使用智能指针,例如QSharedPointer。他们跟踪对其有效负载的引用次数,并在引用计数降至零时将其删除。

      在这种情况下,不要使用QList,而是使用更高效的容器,例如QVector

    2. 它们只携带状态。

      那么,一个“愚蠢的”struct 就足够了。在这种情况下,不要使用QList 作为容器,而是使用更高效的东西,例如QVector(不要忘记善用reserve() 方法)。

    一般来说,尽量避免 QList<T> 用于 T 类型,其中 sizeof(T)>sizeof(void*) 和非内置/非 Qt 类型,因为 QList performance is degraded for these

    【讨论】:

    • 它们只携带状态。从 txt 或 json 获取的简单数据,需要插入到 db 中。我在考虑 QObject,因为我虽然它可以处理我所有的指针问题 :) 但我认为使用 struct 坚持 QVector 可以吗?考虑到这些是 Symbian 设备?
    • @meska: 当然,QVector 具有与 C 内置数组相同的内存布局,因此如果您不在中间添加/删除元素,它的效率最高(在空间和时间上) .甚至在 Symbian 上 :)
    • 好的,那么最后一个问题:如果我有大约 50 个元素要通过 QVector 传递(元素 - 简单数据 5 个字符串,4 个整数),我可以不使用指针就离开吗?
    • @meska: 你的意思是QVector<Element>QVector<Element*>?肯定是前者。
    • 太棒了!感谢您的快速帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多