Объявление переменных за циклом или внутри цикла? - страница 6

 
Georgiy Merts:

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

В смысле "разбросан по программе"?  Локальная переменная объявляется и применяется только в том блоке, где используется.  А если её приходится искать, значит у вас такая портянка кода, что там чёрт ногу сломит )

Объявление всех переменных в начале функции - это как-раз плохой архаичный стиль.  Ещё старина Страструп призывал отказываться от этих олдскульных пережитков старого C в пользу правильного и надёжного кода:  объявление переменной непосредственно по месту использования.  Разве вы не понимаете, что ваш подход чреват множеством случайных ошибок.  Вы хоть инициализируете переменные чем-то?  Или так "на авось", а потом разгребая непредсказуемое поведение кода? )   Возможно когда-то это всё и было оправдано ввиду маломощности железа и слабости компиляторов, но уж точно не сейчас.

 
pivalexander:

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

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

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

 
Alexey Navoykov:

Объявление всех переменных в начале функции - это как-раз плохой архаичный стиль.  Ещё старина Страструп призывал отказываться от этих олдскульных пережитков старого C в пользу правильного и надёжного кода:  объявление переменной непосредственно по месту использования.

имхо, браво! - убедительно, при использовании переменных в локальной области видимости меньше вероятности попасть на не инициализированную переменную, вернее на значение которое было при предыдущем использовании переменной, компилятор не выдаст уже предупреждение, а поиск таких мелких пакостей - утомительно

по сабжу и тестам, ну как бы ни о чем, больше 5-7% разницы не видно, и не факт, что не изменится поведение в следующих билдах

 
Aleksandr Matveev:

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

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

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

и есть те ... не важно это все равно не вы:)

Aleksandr Matveev:

У меня есть подозрение, что автор сего высказывания вообще не в курсе, как работает процессор, память и компилятор... Готов поспорить, что любой ваш код можно ускорить минимум в десятки раз, а то и в сотни.  Из-за таких говнокодеров большинство продуктов сейчас безбожно тормозят на мощнейших компьютерах с десятками ядер, а надо-то всего лишь немножко подумать... Но некоторые считают - "Зачем думать? Надо кодить..."

А у меня есть подозрение, что вы так и застряли на уровне " 87 года начиная с ЕС1020 и ZX Spectrum, "

"Говнокодер" это вы, поэтому и наняли 600 человек...

Без обид

PS: ускорьте мой код, ладно, не в сотни, а хотя бы в десятки раз, код в начале темы, в первом посте, если вы не говнокодер конечно, вы же любой мой код можете ускорить в 10-ки или 100-ни раз, давайте...

 
pivalexander:

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

и есть те ... не важно это все равно не вы:)

А у меня есть подозрение, что вы так и застряли на уровне " 87 года начиная с ЕС1020 и ZX Spectrum, "

"Говнокодер" это вы, поэтому и наняли 600 человек...

Без обид

шесть страниц обсуждений такой пустышки, я тихо фигею ))) деградация форума налицо ))

 
Igor Makanu:

имхо, браво! - убедительно, при использовании переменных в локальной области видимости меньше вероятности попасть на не инициализированную переменную, вернее на значение которое было при предыдущем использовании переменной, компилятор не выдаст уже предупреждение, а поиск таких мелких пакостей - утомительно

по сабжу и тестам, ну как бы ни о чем, больше 5-7% разницы не видно, и не факт, что не изменится поведение в следующих билдах

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

void Func()
{
   int n = 0;// только так
   ....
}
P.S. вот и я сам впал в грех обсуждения ))
 
Igor Makanu:

по сабжу и тестам, ну как бы ни о чем, больше 5-7% разницы не видно, и не факт, что не изменится поведение в следующих билдах

Ну да, а в идеале там и не должно быть разницы вообще, т.к. ситуация достаточно простая для оптимизации.  И даже если тело цикла вынести в отдельную функцию, то будет то же самое, я уверен. Зато господам паранойикам придётся тащить за собой в функцию этот стринг по ссылке, усложняя код )
 
Alexey Navoykov:
Ну да, а в идеале там и не должно быть разницы вообще, т.к. ситуация достаточно простая для оптимизации.  И даже если тело цикла вынести в отдельную функцию, то будет то же самое, я уверен. Зато паранойикам придётся тащить за собой в функцию этот стринг по ссылке, усложняя код )

Там результаты тестов от запуска к запуску должны плавать на 5-15%, винда не ОС реального времени

 
Alexey Volchanskiy:

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

P.S. вот и я сам впал в грех обсуждения ))

))))) , ух ты!

ЗЫ: инициализация при обьявлении переменной это основа написания любого кода с минимум ошибок... тут даже компилятор что то скажет ;)

 
Igor Makanu:

))))) , ух ты!

ЗЫ: инициализация при обьявлении переменной это основа написания любого кода с минимум ошибок... тут даже компилятор что то скажет ;)

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

А варнингов компилятор не выдает

void OnTimer()
{
    string st;
    int n;
    Print(st, n);// специально печатаем неиниализированные, варнингов нет
    for (int i = 0; i < 1000; i++)
    {
        st = IntegerToString(i);
    }
}
Причина обращения: