Оптимальное объявление переменных по объему - PullRequest
8 голосов
/ 02 ноября 2010

Я задаю этот вопрос в основном в отношении программирования на С, но приветствуются идеи по любому языку.

Когда дело доходит до C, я знаю, что он допускает только объявления переменных в самом начале блока кода. И у меня сложилось впечатление, что нужно объявить все переменные, которые будут использоваться внутри функции, в самом начале функции. Но во многих случаях у меня будет переменная, которая используется только внутри цикла (или подобного блока).

Примером может служить временная переменная для некоторого возвращаемого значения:

while ( whatever ) {
  int ret;
  ret = getSomeValue();
}

или где может потребоваться удержание какого-либо состояния:

while ( whatever ) {
  static int count=0;
  count++;
}

Мне было интересно, считается ли это неправильным или есть ли какое-либо негативное влияние на объявление переменных в блоках потока управления, таких как if-else, для циклов, циклов while и т. Д.

Должны ли переменные всегда объявляться с максимально возможной областью видимости? как насчет статического объявления?

Редактировать : Хорошо, я, наверное, должен был сказать, что я знаю, что C99 более либерален, когда речь идет о том, где вы объявляете переменные, но из большого количества кода на C, который я вижу, они все еще обычно объявляются сверху. Кроме того, я использую VS2K8, который все еще жалуется на объявления.

Кроме того, учитывая, что у меня есть 2 голоса, чтобы закрыть эту тему, я поясню, что меня больше интересуют аспекты производительности и компиляции, чем что-либо стилистическое.

Ответы [ 3 ]

6 голосов
/ 02 ноября 2010

Практическое правило заключается в том, что переменные всегда должны быть максимально локальными. Бонусные баллы, если вы можете сделать это const.

5 голосов
/ 02 ноября 2010

Хорошо, в объявлениях в верхней части блоков важны C89 и K & R, но начиная с C99 вы можете смешивать объявления и операторы.Стиль сохраняется, вероятно, по веским причинам, но он не обязателен.

Было время, когда некоторые компиляторы справлялись бы лучше, если вы объявляли множество локальных переменных там, где они использовались, потому что это делало распределение регистровлучше.До C99 вам приходилось объявлять их в верхней части блоков или использовать вендор-расширение, но вы все равно могли решить использовать каждую переменную только в локальной области кода.

Возможно, в какой-то момент казалось важным поддержать это с более гибким размещением объявлений, но я подозреваю, что в наши дни оптимизаторам такая помощь не нужна.

Некоторые стандарты кодирования требуют объявлений в верхней частифункции.Я не знаю, так ли это, чтобы вы могли их найти или это просто осталось со времен, когда неисполнение могло бы ограничить обратную переносимость.

В целом, чем формальнее стандарт, тем меньше ему нравитсячередование операторов и объявлений, за исключением переменных управления циклами.Лично я не вижу в этом проблемы.

Преимущества смешанных объявлений : местность.Хорошо для компилятора, хорошо для читателя.Какая возможная выгода может быть получена от объявления переменной цикла в верхней части функции?Повторное использование переменной вниз по странице для несвязанной цели кажется запутанным и неразумным с точки зрения возможных нежелательных взаимодействий.

Преимущества сгруппированных объявлений : код выглядит чище субъективно, вы знаете, гдечтобы найти все объявления, и если верх вашей функции слишком далек от использования переменной, возможно, это говорит вам о том, что вам нужно извлечь вторую или третью функцию из явно слишком большой.

2 голосов
/ 02 ноября 2010

Когда вы объявляете переменную, это не влияет на генерацию кода.Все переменные функции помещаются в стек еще до того, как будет выполнена первая строка кода (по крайней мере, это наблюдаемое поведение).Как вы уже знаете, правила объявления переменных давно устарели.Объявление переменных в верхней части имеет эти преимущества

  • , которые легче читать, когда все переменные можно найти в одном месте
  • , вам не нужно беспокоиться о перестановке кода, если вам нужновнезапный доступ к переменной до ее объявления (если, конечно, вы намеренно не хотите этого предотвратить).

И да, я бы сделал переменные настолько локальными, насколько это возможно.Если переменная используется только в цикле или потоке управления или даже в бессмысленной паре {} (которую я использовал для предотвращения конфликта имен), объявите их там.Возьмите знаменитую переменную n или i для циклов.Если у вас есть несколько, вам понадобится уникальное имя переменной для каждого цикла for, что станет раздражающим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...