Где лучшее место для объявления переменных?
Я пытаюсь оптимизировать программу на C++, которую я реализовал, и у меня возник вопрос... Где мне объявить переменную, если у меня есть повторяющаяся структура, использующая ее?
Например:
//1-> int sum;
int matrix[10][10];
for(int i = 0; i < n; i++){
//1-> sum=0;
//2-> int sum=0;
for(int j = 0; j < n; j++)
sum += matrix[i][j];
printf("%d ", sum);
}
Так что лучше / рекомендуется? Должен ли я объявить это в начале //->1 за пределами повторяющейся структуры, или это нормально, если повторно объявлено //->2 на каждой итерации? Я предполагаю, что объявление занимает очень небольшое время (миллисекунды или меньше), но если вы переопределите его в достаточно большой повторяющейся структуре (или внутри нескольких структур), то каждое объявление будет складываться в дополнительные секунды.
3 ответа
Для int
это просто не имеет значения. Для типа с нетривиальным конструктором или деструктором, согласно схеме 2, он будет создаваться и уничтожаться каждый раз через внешний цикл, и это может занять много времени.
Это не важно Стек (зарезервированное пространство в памяти) выделяется все вместе в начале функции / метода. Если это объект, конструктор и деструктор будут вызваны где-то в области действия вашего цикла. Но для элементарных типов нет абсолютно никакой разницы.
Как уже говорили другие, это в основном не имеет значения для int
,
Здесь есть только две вещи:
- читабельность
- Объем
Если int
объявлено прямо перед for
цикл, а не как первая строка for
цикл, читаемость, вероятно, примерно то же самое. Кроме того, многие компиляторы будут иметь ярлык для быстрого перехода к объявлению.
Что касается Scope, если вам не нужна переменная вне цикла, ее размещение внутри поможет вам избежать случайного использования вне цикла каким-либо образом. Если вам это нужно вне цикла, у вас действительно нет большого выбора.
Примечание о моих личных предпочтениях, которое сочетает в себе проблемы как с областью видимости, так и с читабельностью. Когда я пишу код, я предпочитаю иметь КАЖДУЮ переменную, которую я буду использовать в заданной области, объявленной в начале этой области. Любая переменная, которую я использую в main
объявлен в верхней части main
, Любая переменная, используемая в функции, объявляется в верхней части этой функции. Любая переменная, используемая в цикле, объявляется в верхней части этого цикла. Любая переменная, используемая в if
Заявление объявлено в верхней части этого if
заявление. Я лично делаю очень мало исключений. Так что в вашем случае, если scope
из sum
ограничен исключительно вашим for
цикл, я бы объявил его в качестве первой переменной for
петля. Если sum
нужна область вне цикла, я бы объявил ее в верхней части любой функции, в которой вы находитесь, и дал бы ей гораздо более описательное имя.