2012-02-10 3 views
2

Я буду выделять и освобождать МНОГИЕ динамические многомерные массивы, представляющие матрицы, каждый кадр.Массивы против векторов против Boost :: массивы

приоритеты, даже за счет ошибок проверки и ручного управления памятью:

  1. Скорость
  2. Малый памяти след

массивы C-стиль лучший выбор, учитывая эти приоритеты ? Я знаю, что это часто задаваемый вопрос, но я не смог найти окончательного ответа на мои обстоятельства.

ответ

2

Если вы можете охарактеризовать максимальный объем памяти, необходимый для набора этих массивов, который будет использоваться для любого конкретного «фрейма» (что бы это ни было), и если вы будете иметь дело только с одним кадром за раз (другими словами, вы будете выполнять работу над одним набором массивов, а затем сбрасывать все эти массивы, прежде чем выполнять другой раунд работы над другим набором массивов), тогда вы, скорее всего, получите максимальную производительность, выделив свои массивы из блок статической памяти, размер которого соответствует вашему максимальному набору рабочих заданий.

Тогда ваше распределение массива может быть простым распределителем пулов, который вырезает память для массива с передней части блока и корректирует указатель блока только после того, как выделение будет готово для следующего распределения массива. Когда вы закончите работу над этим набором массивов, все можно освободить, «очистив пул» - просто сбросив указатель блока на начало пула статической памяти.

Конечно, поскольку вы не дали подробностей о том, как ваша работа должна быть выполнена, этот метод может вообще не подходить (возможно, поэтому вы еще не нашли окончательного ответа - такой ответ зависит от конкретных характеристик выполняемой вами работы).

0

Вы даете нам слишком мало информации о вашей проблеме, чтобы дать вам хороший ответ. Предполагается ли ваша программа работать только на одной платформе или должна быть независимой от платформы? Является ли время-эффективность критически важным для вашего проекта? Если это так, возможно, использование «нового» и «удаления» будет слишком медленным для вас, и вам нужно обратиться к определенному платформенному или стороннему распределителю. Тогда выбор между динамически распределенным массивом и std :: vector не должен иметь значения. Или вы хотите выделить массивы в стеке? Но существует ограничение на размер массива, который вы можете создать в стеке. Каковы размеры матриц?

0

std :: векторы, как правило, так же хороши, как и C-массивы, но если вы хотите получить конечную скорость голой кости, и вы знаете, что вы делаете, ничто не может сравниться с управлением C-массивом.

Есть компромиссы, которые вы должны учитывать. - Сколько времени вы готовы потратить на отладку пользовательского кода? - Сколько пользовательского кода вы хотите написать?

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

0

Если вы хотите представить матрицу, один массив unifimensionnal уже лучше, чем многомерный массив. Массив - это уже самая простая структура, которую вы имеете в своем расположении, поэтому это более уместно.

Цель Vector - реализовать динамический массив, и вам может не понадобиться эта функция, так как матрица имеет фиксированный размер.

Смежные вопросы