Массивы против векторов против усиления :: массивы - PullRequest
2 голосов
/ 10 февраля 2012

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 10 февраля 2012

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

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

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

0 голосов
/ 10 февраля 2012

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

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

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

0 голосов
/ 10 февраля 2012

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

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

0 голосов
/ 10 февраля 2012

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

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