我有这个应用程序要求我有一个QList,其中包含1< x< 10000多个物体。现在我有几个问题。
首先,我应该将QList声明为指针还是直接在堆栈上? QList中的对象非常小,是QFileInfo的包装器。但是我应该怎么做呢?
A ..
QList<FileInfoWrapper>*
首先,如果我选择解决方案2,那么我的堆是否会变得一团糟,因为我只是在整个地方分配一小部分数据?我不想那样。 其次,如果我选择第3个解决方案,当我访问单个对象时,它会在内存中看起来如何?我可以创建指向它们的指针(它们在堆上是什么意思)?
然后我们来讨论另一个问题。这个列表将像餐馆的叉子一样过去,在某些时候我想创建不包含任何数据的子列表,只引用/指向列表中某些对象的指针(例如对象0到250) 。然后,我将这些列表抛出到不同的线程中,这些线程必须具有对象的ref才能编辑它们(读取:不是硬拷贝)。
此外,有人可能会在您创建这样的列表时准确解释堆上发生的事情:
QList<FileInfoWrapper>* list = new QList<FileInfoWrapper>();
是否就像在c中你只是创建一个指向该对象所在偏移量的指针?
*(list + sizeof(FileInfoWrapper) * 10)
答案 0 :(得分:1)
QList
是一个容器类......这意味着它为你管理内存,所以你不必担心它。它的基础数据结构是variant of a deque with some special modifications,因此您对列表中索引的理解是不正确的。但无论哪种方式,这些都是由界面抽象出来的细节,您无需担心它们。您只需使用给定的类方法(如operator[]
或at()
)来获取对给定索引处对象的引用,以及其他函数(如push_back()
或insert()
)以将对象复制到容器。因此,您只需在堆栈上创建一个QList
实例(只要它在需要时不会超出范围),并将对象复制到其中。底层数据结构将正确地分配动态所需的内存来存储对象,并且在销毁QList
对象时,它将释放用于存储它“拥有”的对象的内存。
考虑QList
,你会想到像std::vector
或std::list
这样的STL容器...再次,QList
的基础数据结构不一样作为这些STL容器,但重点是您可以像在任何其他类中一样在堆栈上分配数据结构,并且它包含管理堆上内存所需的所有私有数据成员和信息。通过调用QList
在堆上分配new
并没有在这方面获得任何东西......在数据结构内部已经有指针等分配和管理内存为你包含物品。
最后,不要担心数据碎片。一个好的容器类的要点是正确分配内存以避免内存碎片问题过于频繁地分配和重新分配内存。另外,分配内存需要时间,因此如果容器类经常需要调用new
,那将真正损害它的性能。虽然在每次插入时分配内存可能是基于节点的容器(如链表和树),哈希表,动态数组和其他块类型数据结构在利用它们分配的内存以最小化时更加高效这些分配电话。