Два массива: есть ли разница в инициализации и удалении?

205
22 декабря 2017, 02:14

Изучаю C++. Нужны большие массивы. Хочу понять, есть ли разница в инициализации и удалении (скорость важнее, но также важно, чтобы не было проблем) между:

int sequence[1000000];

и

std::array<int, 1000000> sequence;

Или вообще нет разницы?

Update 1

Получается, чтобы не было проблем со стеком, я должен поступать как-то так:

auto sequence = std::make_unique<int[]>(1000000); 

И тогда массив будет создаваться в динамической памяти?

Answer 1

Оба ваших варианта создают обычный массив (указатель) на 1000000 элементов типа int

Однако они это делают в стеке (stack), временной памяти конкретной функции. Если вам нужно эти данные не только создать, но и обработать, и скорее всего - в нескольких функциях, то разумнее использовать динамическую память (heap)

Чтобы создавать массивы в динамической памяти, используйте конструкции new, а лучше STL:

std::vector<int> dynamic_array;

Такой "массив" будет хранить все ваши int в динамической памяти, но сама переменная будет создана там, где вы ее создадите. Если это будет в функции - при выходе из функции (за границу видимости) переменная и все ее содержимое уничтожится автоматически. Варианты: глобальная переменная, поле глобального класса или везде таскать указатель на эту переменную созданную через new, смотря как у вас спроектирован проект

Если вас интересует скорость, вы можете сэкономить время на изменении размера области памяти под хранение элементов (при помещении элементов в std::vector он автоматически разрастается в памяти), сразу вызвав resize(N) с известным вам заранее размером массива

Работать с вектором можно так же, как с обычным массивом, через std::vector[]:

dynamic_array.resize(100);
dynamic_array[11] = 5;
dynamic_array[10] = dynamic_array[11];
std::cout << dynamic_array[10] << std::endl;

Если для вас крайне важна скорость, динамическую память можно задействовать и проще:

int *sequence = new int[1000000];
if (sequence) { // Можно не проверять, new по умолчанию кидает исключение при неудаче
    /* Производите всю необходимую работу */
    delete [] sequence;
    sequence = NULL;
}

Не факт, что простая работа с указателем даст значительный выигрыш по времени, но обертка std::vector в итоге делает именно это + некую обертку и дополнительные проверки. Однако в данном случае всю заботу о содержимом и о занятой памяти вы должны будете взять на себя. Но вы программист Си, вы крепкий, справитесь ) Кто же кроме нас.. )

READ ALSO
Количество аргументов функции

Количество аргументов функции

Недавно был вопрос о том, как объявить функцию с n аргументами заданного типаУ меня возник противоположный вопрос

240
Реализация поиска простых делителей

Реализация поиска простых делителей

Всем привет, написал код по поиску простых чисел и запоминания этих чисел и их степеней:

289
Сканер отпечатков пальцев в Qt для iOS и Android

Сканер отпечатков пальцев в Qt для iOS и Android

Нужно немного поработать со встроенными в смартфоны сканерами отпечатков пальцев на iOS и AndroidC++/Qt/qml

234
Сортировка строки двумерного массива

Сортировка строки двумерного массива

Задача: Написать функцию которая принимает указатель на двумерный массив , количество строк, количество столбцов и строку k которую нужно...

257