Динамический и непрерывный массив

0

Есть ли способ сделать 1D динамический и непрерывный массив с использованием C++ 11?

Я возьму размер массива через stdin и после его создания его не нужно изменять.

Прямо сейчас я использую 1D вектор перечислений, и моя самая большая проблема с производительностью - это оператор vector [].

Если это невозможно сделать в C++, я открыт для способов сделать это с помощью malloc и C, просто обратите внимание на лучший способ его delete.

Редактировать: Не понимал, что векторы были день и ночь с отладкой и выпуском. Я перепробовал callgrind с -O3, и теперь проблема не в векторах - благодаря всем, кто заставил меня догадаться до того, как я переписал все это, используя массивы, когда это не нужно.

  • 2
    Эта операция над вектором обычно не дороже, чем индекс в массиве.
  • 0
    Является ли проблема, которую вы используете enums ? Почему вы не используете обычные целые числа?
Показать ещё 1 комментарий
Теги:
arrays
dynamic
malloc

5 ответов

3
Лучший ответ
    int size = 10;
    std::unique_ptr<int[]>  a(new int[size]);

Выполняет RAII (массив массива автообновляется) Однако я не думаю, что оператор vector [] должен быть проблемой производительности. В отладочной компиляции он может быть проверен, однако в выпуске он не должен.

В MSVC есть функция, называемая проверенными итераторами, которые могут "убить" производительность. Однако вы можете отключить эту функцию (просто Google)

3

Вы всегда можете динамически создавать непрерывное однородное хранилище определенного типа из кучи с использованием нового оператора

Type *pType = new Type[size](initial_value)

Чтобы удалить хранилище, необходимо явно вызвать оператор удаления массива

delete[] pType

Но, когда вы говорите, and my biggest performance issue is the vector [] operator. , Я сомневаюсь. Вы прокомментировали розничную версию своего кода? Как вы знаете, что векторный индекс является вашим узким местом производительности?

  • 1
    +1 "Я сомневаюсь. Вы профилировали розничную версию своего кода?"
2

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

Кроме того, вы можете использовать new и delete операторы.

Для бесплатной выделенной памяти используйте функцию free(void *ptr).

0

В C вы создаете одномерный массив с

int *ptr=NULL;
int num_elements = 0;
printf("how many elements?\n");
if(scanf("%d", &num_elements)==1) {
  ptr = malloc(sizeof(int)*num_elements);
  if(ptr == NULL) {
    printf("unable to allocate %d elements\n", num_elements);
    exit 0;
  }
} 

и когда вы закончите, вы позвоните

free(ptr);

Убедитесь, что вы вызываете его только один раз! Некоторые люди будут делать

if( ptr != NULL ) {
  free(ptr);
  ptr = NULL;
}

как защитное кодирование - предотвращает случайное освобождение его дважды.

  • 0
    блок if не нужен - освобождение нулевого указателя вполне нормально.
  • 0
    @AndreasGrapentin см stackoverflow.com/questions/1938735/... - «это не всегда было так». Я помню столкновение с аварийным завершением при освобождении NULL (Borland C на ПК в начале 90-х, возможно). Я подозреваю, что «ничего не делать в free(NULL) стандарте» не всегда было.
Показать ещё 2 комментария
0

Если вы используете C++, использование malloc, вероятно, является плохой (плохой) идеей.

int length;
cin >> length;

MyType * array = new MyType[length];

Затем, чтобы удалить,

delete[] MyType;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню