#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)
. Связанный список называется QLinkedList3. Вы имеете в виду, что все элементы списка хранятся в «массиве» структурных данных? Если мы создадим локальную переменную QStringList, она займет всего 8 байт в стеке (в 64-битной системе)?
4. Правильно. Элементы хранятся в массиве, выделенном для кучи. Сам QList — это просто
sizeof(pointer)
байты в стеке