Я пытаюсь оптимизировать программу на 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 на каждой итерации?
Я предполагаю, что объявление занимает очень небольшое время (миллисекунды или меньше), но если вы переопределите его в достаточно большой повторяющейся структуре (или внутри нескольких структур), то каждое объявление будет складываться в дополнительные секунды.
Для int
это просто не имеет значения. Для типа с нетривиальным конструктором или деструктором в соответствии со схемой 2 он будет создаваться и уничтожаться каждый раз через внешний цикл, и это может занять много времени.
Это не важно Стек (зарезервированное пространство в памяти) выделяется все вместе в начале функции / метода. Если это объект, конструктор и деструктор будут вызваны где-то в области действия вашего цикла. Но для элементарных типов нет абсолютно никакой разницы.
Как уже говорили другие, это в основном не имеет значения для int
,
Здесь есть только две вещи:
Если int
объявлено прямо перед for
цикл, а не как первая строка for
цикл, читаемость, вероятно, примерно то же самое. Кроме того, многие компиляторы будут иметь ярлык для быстрого перехода к объявлению.
Что касается Scope, если вам не нужна переменная вне цикла, ее размещение внутри поможет вам избежать случайного использования ее вне цикла. Если вам это нужно вне цикла, у вас действительно нет большого выбора.
Примечание о моих личных предпочтениях, которое сочетает в себе проблемы с областью видимости и читабельностью. Когда я пишу код, я предпочитаю иметь КАЖДУЮ переменную, которую я буду использовать в заданной области, объявленной в начале этой области. Любая переменная, которую я использую в main
объявлен в верхней части main
, Любая переменная, используемая в функции, объявляется в верхней части этой функции. Любая переменная, используемая в цикле, объявляется в верхней части этого цикла. Любая переменная, используемая в if
Заявление объявлено в верхней части этого if
заявление. Я лично делаю очень мало исключений. Так что в вашем случае, если scope
из sum
ограничен исключительно вашим for
цикл, я бы объявил его в качестве первой переменной for
петля. Если sum
нужна область вне цикла, я бы объявил ее в верхней части любой функции, в которой вы находитесь, и дал бы ей гораздо более описательное имя.