Разбить QList на куски, указатели или ссылки? - PullRequest
2 голосов
/ 22 февраля 2012

У меня есть это приложение, которое требует, чтобы у меня был QList, который будет содержать 1

Прежде всего, я должен объявить QList как указатель или прямо в стеке? Объекты в QList довольно маленькие и являются обертками для QFileInfo. Но как мне это сделать?

  1. Список объектов в стеке?
  2. Список (в стеке) указателей на объекты в куче?
  3. A ..

      QList<FileInfoWrapper>*
    

Во-первых, если я выберу решение 2, будет ли моя куча беспорядком, поскольку я просто распределяю небольшие порции данных повсюду? Я этого не хочу. Во-вторых, если я выберу 3-е решение, как это будет выглядеть в памяти при доступе к отдельным объектам? И могу ли я создать для них указатели (они вообще в куче)?

Тогда мы подошли к моей другой проблеме. Этот список будет проходить как закусочная в закусочной, и в какой-то момент я хотел бы создать подсписки, которые не содержат никаких данных, только ссылки / указатели на некоторые из объектов в списке (например, объект от 0 до 250) , Затем я добавлю эти списки в разные потоки, которые должны иметь ссылку на объект, чтобы иметь возможность редактировать их (читай: не печатная копия).

Кроме того, кто-то может объяснить точно, что происходит в куче, когда вы создаете список, подобный этому:

QList<FileInfoWrapper>* list = new QList<FileInfoWrapper>();

Было бы как в c, где вы просто создаете указатель на смещение, где будет расположен этот объект?

*(list + sizeof(FileInfoWrapper) * 10)

1 Ответ

1 голос
/ 22 февраля 2012

QList - это контейнерный класс ... это означает, что он управляет памятью, поэтому вам не нужно об этом беспокоиться. Базовая структура данных представляет собой вариант deque с некоторыми специальными изменениями , поэтому ваше понимание индексации в списке неверно. Но так или иначе, это детали, которые абстрагируются от интерфейса, и вам не нужно беспокоиться о них. Вы просто используете данные методы класса, такие как operator[] или at(), чтобы получить ссылку на объект по заданному индексу, и другие функции, такие как push_back() или insert(), чтобы копировать объекты в контейнер. Таким образом, вы можете просто создать экземпляр QList в стеке (при условии, что он не выйдет из области видимости, пока он необходим) и скопировать в него объекты. Базовая структура данных будет правильно распределять память, необходимую для динамического хранения объектов, и во время уничтожения объекта QList она освобождает память, используемую для хранения объектов, которыми она «владеет».

Думайте о QList так же, как если бы вы думали о контейнере STL, таком как std::vector или std::list ... опять же, базовая структура данных для QList не совпадает с этими контейнерами STL, но суть заключается в том, что вы можете разместить структуру данных в стеке так же, как и в любом другом классе, и он содержит все частные члены-данные и информацию, необходимую для управления памятью в куче. Выделение QList в куче с помощью вызова new ничего вам не даст в этом отношении ... уже есть указатели и т. Д. Внутри структуры данных, для вас выделение и управление памятью содержащихся объектов .

Наконец, не беспокойтесь о фрагментации данных. Смысл хорошего контейнерного класса в том, чтобы правильно распределить память, чтобы избежать проблем фрагментации памяти из-за слишком частого выделения и перераспределения памяти. Кроме того, выделение памяти занимает много времени, поэтому если класс контейнера постоянно должен вызывать new, это действительно ухудшит его производительность. Хотя выделение памяти для каждой вставки может быть необходимостью для контейнеров на основе узлов, таких как связанные списки и деревья, хеш-таблицы, динамические массивы и другие структуры данных блочного типа гораздо более эффективны при использовании памяти, которую они выделяют, чтобы минимизировать эти вызовы распределения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...