2016-03-30 2 views
-3

Предоставление числа X и чтение X-чисел в одномерный массив, какой из следующих способов является лучшим (быстрее всего времени выполнения)?Выделение C/C++

Пожалуйста, обратите внимание, что X представляет собой число от 1 до 1000000.

scanf("%d", &x); 
int array[x]; 
//continue reading X numbers into array 

Или

scanf("%d", &x); 
int array[1000000]; 
//continue reading X ... 

Или

scanf("%d", &x); 
int * array = malloc(x*sizeof(int)); 
//same as above 
free(array); 

Или метод динамического распределения в C++?

Примечание 1: что я размещаю это с мобильного телефона, я надеюсь, что формат для кода выше, если нет, я прошу кого-нибудь (< 3) отредактировать его, так как это больно с отступом кода с телефона.

Примечание 2: Как я могу проверить, что я спросил выше?

+1

Используйте таймер, чтобы подсчитать время, затрачиваемое на три разных метода ... Хотя я определенно запретил бы номер 2 'array [1000000]', как если бы у вас было всего 1 данные, вы потеряете много памяти ... –

+0

Вы используете массив переменной длины в первом методе! – CinCout

+5

Вы действительно заботитесь о времени выполнения при использовании пользовательского ввода ?! Вы заметите какую-либо разницу? –

ответ

1

Поскольку появляется scanf (и комментарии предполагают, что есть еще миллион звонков scanf), любые вопросы относительно распределения памяти в сочетании с «Какой самый быстрый?» могут быть повсеместно удовлетворены: «Да» (читайте как: неактуально).

В то время как автоматическое хранилище («распределение стека»), как правило, быстрее, чем фристайл, это совершенно незначительно по сравнению с тем временем, которое вы потратите на scanf. При этом обычно (не обязательно, но обычно) динамическое освобождение, которое медленное, а не распределение.

Пару моментов отметить в целом по этому коду:

  1. Чтение целое число от какого-либо внешнего источника (файл, сеть, ARGV, безотносительно) и делать распределение на основе этого числа , не делая проверка на работоспособность первая - это очень плохая карма. Это должно вызвать проблему в один прекрасный день, это то, как многие существующие реалии реального мира возникли. Не верьте слепо, что любое число, которое вы получили откуда-то, автоматически действует. Даже если злодея не участвует, авария может по-прежнему содержать недопустимое число, которое может привести к катастрофическому сбою.
  2. Выделение массива не константного размера в стеке будет работать в последних версиях C и будет работать как расширение даже в C++, если вы используете GCC, но обычно это не допустимо в C++ (это означает, что он не сможет компиляции).
  3. Выделение миллиона целых чисел означает примерно 4 МБ памяти, что довольно жестко по отношению к максимальному размеру стека (часто только 1 МБ). Ожидайте переполнение стека.
  4. Выделение неизвестно Число целых чисел (но ожидаемое число до миллиона) аналогично (3).
  5. Хуже всего, что re (3) и (4) состоит в том, что он может фактически добиться успеха. Это может означать, что ваша программа неожиданно выйдет из строя позже (столкнувшись с переполнением стека) в совершенно несвязанной невинной части кода. И вы будете задаваться вопросом, почему это происходит, поскольку код, который выходит из строя, выглядит так, как будто он абсолютно прав (и это действительно!).
1

Вы получите ошибку компиляции для этого кода:

scanf("%d", &x); 
int array[x]; 

х должны быть известны во время компиляции в этом случае.

При использовании int array[1000000] вы выделяете память в стеке, а не в кучу, поэтому это принципиальная разница по сравнению с malloc или new operator. Это было бы быстрее, потому что на самом деле требуется только одна команда ЦП для изменения указателя стека.

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

+0

В C++ я попробовал его cin >> x; int array [x]; и он компилируется просто отлично. (Я предположил, что он работает одинаково в C) –

+1

@CodeFuller также в C (начиная с C99), он действителен (и он также был расширением GCC). О, BTW ... Неужели вы действительно думаете, что можете измерить разницу в производительности между новыми и malloc? Это медленнее (правда), но потому что он делает что-то еще ... –

+1

Ну, может быть int array [x] может быть скомпилирован с помощью gcc, но стандартный C++ этого не поддерживает. В VS вы получите ошибку ошибки C2133: 'array': unknown size '. – CodeFuller

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