2014-02-02 3 views
0

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

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

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

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

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

+2

Эта операция над вектором обычно невелика, чем индекс в массиве. – sje397

+0

Проблема в том, что вы используете 'enums'? Почему вы не используете обычные целые числа? – Floris

+0

Я использую перечисления для удобочитаемости, это перечисление в 1 байт, и я выполняю побитовые операции над ним. – ParoX

ответ

3
int size = 10; 
    std::unique_ptr<int[]> a(new int[size]); 

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

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

0

В C вы создаете массив 1-D с

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 см. Http://stackoverflow.com/questions/1938735/does-freeptr-where-ptr-is-null-corrupt-memory - «это было не всегда так». Я помню, как набегало разбиться на освобождение NULL (возможно, Borland C на ПК в начале 90-х). Я подозреваю, что «ничего не делать на« свободном »(NULL) стандарте не всегда было. – Floris

+0

принятый ответ в вашем связанном вопросе, кажется, поддерживает мою точку :) –

3

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

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

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

delete[] pType 

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

+1

+1 «Сомневаюсь. Вы прокомментировали розничную версию своего кода? " –

0

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

int length; 
cin >> length; 

MyType * array = new MyType[length]; 

Затем удалить,

delete[] MyType; 
2

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

Также вы можете использовать операторы new и delete.

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

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