QStringList хранит данные в стеке или в куче?

#qt #stack #heap-memory #qstring #qstringlist

#qt #стек #куча-память #qstring #qstringlist

Вопрос:

В приведенном ниже коде:

 void fun()
{
    QString aa("aa");
    QString bb("bb");
    QStringList a;
    a<<aa;
    a<<bb;
}
  

Я знаю, что QString хранит свои данные в куче, но как насчет QStringList? Он выделяет массив в стеке или в куче и сохраняет только указатель на массив в стеке?

Комментарии:

1. Согласно документации, QStringList наследуется от QList<QString> . Соответствующие детали там.

Ответ №1:

QList технически:

 class QList
{
    QListData::Data* p;
};
  

где QListData::Data:

 struct Data 
{
    QtPrivate::RefCount ref;
    int alloc, begin, end;
    void *array[1];
};
  

Таким образом, QList сам выделяет память в куче и сохраняет указатель на нее.

Комментарии:

1. Я думаю, что array[0] указывает на данные элемента, выделенного в куче, верно? Но я не видел указателя цепочки, связывающего каждый элемент списка. p указывает только на первый элемент в списке?

2. Это потому, что QList не является списком . QList больше похож на вектор, но со странной стратегией хранения элементов больше, чем sizeof(pointer) . Связанный список называется QLinkedList

3. Вы имеете в виду, что все элементы списка хранятся в «массиве» структурных данных? Если мы создадим локальную переменную QStringList, она займет всего 8 байт в стеке (в 64-битной системе)?

4. Правильно. Элементы хранятся в массиве, выделенном для кучи. Сам QList — это просто sizeof(pointer) байты в стеке