Изучаю C++. Нужны большие массивы. Хочу понять, есть ли разница в инициализации и удалении (скорость важнее, но также важно, чтобы не было проблем) между:
int sequence[1000000];
и
std::array<int, 1000000> sequence;
Или вообще нет разницы?
Update 1
Получается, чтобы не было проблем со стеком, я должен поступать как-то так:
auto sequence = std::make_unique<int[]>(1000000);
И тогда массив будет создаваться в динамической памяти?
Оба ваших варианта создают обычный массив (указатель) на 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 в итоге делает именно это + некую обертку и дополнительные проверки. Однако в данном случае всю заботу о содержимом и о занятой памяти вы должны будете взять на себя. Но вы программист Си, вы крепкий, справитесь ) Кто же кроме нас.. )
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Недавно был вопрос о том, как объявить функцию с n аргументами заданного типаУ меня возник противоположный вопрос
Всем привет, написал код по поиску простых чисел и запоминания этих чисел и их степеней:
Нужно немного поработать со встроенными в смартфоны сканерами отпечатков пальцев на iOS и AndroidC++/Qt/qml
Задача: Написать функцию которая принимает указатель на двумерный массив , количество строк, количество столбцов и строку k которую нужно...