Qlist 适合在服务中使用吗?
Posted
技术标签:
【中文标题】Qlist 适合在服务中使用吗?【英文标题】:Qlist suitable for use in service? 【发布时间】:2014-01-27 16:42:55 【问题描述】:我正在创建一个将作为服务(在 linux 下)运行的 C++ 程序,并且我使用 Qt 是因为有许多方便的方法。我正在使用 QList 来跟踪将在几个月内添加到 qlist 和从中删除的项目。 (每天可能有数百个添加/删除)。
根据我最近的阅读,QList 似乎永远不会缩小 - 它们只会在内存使用量方面增长(直到整个 QList 被释放)。这是否会使 QList 不适合在无限期运行的应用程序中使用?
我需要创建自己的链表吗?或者有没有办法“缩小”/清理 QList 中使用的内存?
更新:根据以下反馈,QLinkedList 更可取吗? (当列表的成员被“擦除”时,它是否立即释放内存)
【问题讨论】:
哎呀!不知道QList。你在哪里读到的? QList 是 Qt(一个 C++ 库)的一个特性 @laser_wizard 它在文档中这么说,但是 QList 使用T*[]
(指向 T 的指针数组)来存储数据,所以它并不是那么糟糕
看起来@ratchetfreak 有一些很好的信息 :)
您是否真的测量了QList
的内存使用情况并将其确定为您需要担心的事情,或者这只是货物崇拜编程?在具有 64 位指针的平台上,根据经验,QList
每 100 个大项目(大于 8 字节)大约有 1kByte 的开销。此开销与列表中一次存储的项目的峰值数量成比例。因此,例如,如果您在列表中存储的项目不超过 1000 个,则开销永远不会超过 10kBytes。我认为担心它是浪费时间。如果您另有声明,请与我们分享您的测量方式和结果。
【参考方案1】:
Qt 有自己的 QVector 和 QLinkedList
QVector 有一个squeeze
函数,可以在需要时释放未使用的内存
【讨论】:
从更多阅读来看,QVector 的添加/删除开销很大。 (我的名单发生了迅速的变化)。由于我只附加到列表的末尾,这是否会使 QLinkedList 成为首选? @Michelle 取决于您添加和删除的位置,Qt 中(以及 C++ 的标准库中也有)实现了其他 container classes 我仍然是 Qt 的初学者,所以试图避免更多的学习(已经被 Qt 淹没了)。我看到 QLinkedList 没有挤压命令,这是否意味着它总是立即释放未使用的内存(在擦除调用时)?所以这似乎是最好的 @Michelle QLinkedList 立即释放未使用的内存【参考方案2】:是什么“阅读”让你想到了QList
?如果它永远不会释放未使用的内存,那么它本质上就是在泄漏内存,而事实并非如此。
QList
在内部实现为指针向量。当对象足够小以容纳与指针相同的字节数时,列表等效于QVector
。内部向量 也许 不会缩小,但这在实践中并不重要。每个元素只有 4 或 8 个字节,并且受列表中存在的项目总数的限制。这很可能是一条红鲱鱼。
【讨论】:
可能是QList
文档中声明的部分:Note that the internal array only ever gets bigger over the life of the list. It never shrinks. The internal array is deallocated by the destructor and by the assignment operator, when one list is assigned to another.
@thuga 该内部数组每个元素存储 4-8 个字节。除非您存储非常小的元素,否则它永远不会缩小并不重要。几个大小合适的元素所占用的存储空间将掩盖数组使用的任何空间。
正如我上面提到的,我每天要添加和删除数百个项目。如果此服务运行一年,它可能会消耗大量内存。 (一般来说,一个不断消耗更多内存的应用程序听起来设计得不好)。文档还说,添加到 QVector 将导致整个元素数组被复制到新数组以保持内存连续;不断添加和删除项目时听起来不合适)。 QLinkedList 听起来像是赢家!?
@Michelle:否! 内存开销随list->size()
的最大值 扩展。这就是全部。添加和删除多少项目并不重要。您正在消耗大约 8*list->size()
(在 64 位指针平台上)的开销,而这个开销只会增加,不会减少。因此,重要的不是您添加或删除了多少项目,而是列表中一次有多少项目。 QLinkedList
的开销甚至更高 - 至少 24*list->size()
,但这个开销可能会下降。
@Michelle:同样,您最好有可靠的测量结果来表明这是一个问题。否则只是浪费时间。您需要一个易于使用的数据结构。当您的测试表明间接费用很重要时,请担心间接费用。以上是关于Qlist 适合在服务中使用吗?的主要内容,如果未能解决你的问题,请参考以下文章