我有这个应用程序,要求我有一个包含1
首先,我应该将QList声明为指针还是直接放在堆栈上? QList中的对象很小,并且是QFileInfo的包装。但是我应该怎么做呢?

  • 堆栈上的对象列表?
  • 指向堆上对象的指针的列表(在堆栈上)?
  • A ..
      QList<FileInfoWrapper>*
    

  • 首先,如果我选择了解决方案2,由于我只是在整个位置分配一小部分数据,我的堆是否会一团糟?我不要
    其次,如果我选择第三个解决方案,那么当访问单个对象时,它在内存中的外观如何?我可以创建指向它们的指针吗(毕竟它们在堆上)?

    然后我们来谈我的另一个问题。该列表将像餐叉上的 fork 一样过去,并且有时我想创建一个不包含任何数据的子列表,仅引用/指针指向列表中的某些对象(例如,对象0至250) 。然后,我将把这些列表放入不同的线程中,这些线程必须具有对该对象的引用才能进行编辑(阅读:不是硬拷贝)。

    另外,当您创建这样的列表时,有人可以确切解释堆上会发生什么:
    QList<FileInfoWrapper>* list = new QList<FileInfoWrapper>();
    

    就像在c中只是创建一个指向该对象将位于的偏移量的指针一样吗?
    *(list + sizeof(FileInfoWrapper) * 10)
    

    最佳答案

    QList是一个容器类...这意味着它可以为您管理内存,因此您不必担心。它的基础数据结构是variant of a deque with some special modifications,因此您对索引到列表的理解不正确。但是,无论哪种方式,这些都是接口(interface)所抽象的细节,您不必担心它们。您只需使用给定的类方法(例如operator[]at())来获取给定索引处的对象的引用,并使用其他函数(例如push_back()insert())将对象复制到容器中。因此,您可以简单地在堆栈上创建一个QList实例(只要它在需要时不会超出范围),然后将对象复制到其中即可。基础数据结构将适当地动态分配存储对象所需的内存,在销毁QList对象时,它将分配用于存储“拥有”的对象的内存。

    再想一想QList,就像想像std::vectorstd::list之类的STL容器一样……QList的基础数据结构与这些STL容器不同,但要点是您可以在STL容器上分配数据结构。堆栈就像其他任何类一样,包含所有私有(private)数据成员和管理堆上内存所需的信息。在这方面,通过调用QList在堆上分配new不会给您带来任何好处...在数据结构内部已经有指针等为您分配和管理所包含对象的内存。

    最后,不必担心数据碎片。好的容器类的要点是正确分配内存,以避免内存碎片问题过于频繁地分配和重新分配内存。另外,分配内存需要花费时间,因此,如果容器类经常需要调用new,那确实会损害其性能。尽管对于每个插入都需要分配内存,但对于像链表和树之类的基于节点的容器而言,散列表,动态数组和其他块类型数据结构可能更有效地利用了它们分配的内存以最小化这些分配调用。

    关于c++ - 将QList拆分为块,指针或引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9388792/

    10-12 20:19