Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/244: Рейтинг темы: голосов - 244, средняя оценка - 4.95
 Аватар для Lyosha12
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313

Объявление переменной в цикле - зло?

29.10.2016, 03:20. Показов 48317. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Во имя читаемости пришлось объявить и инициализировать ссылки на переменные и сами переменные в теле цикла.
Преподаватель против такой практики, но почему - внятно объяснить не может.
Находил темы с большим холиваром по этому поводу, но ясной однозначности не нашёл.

Читал, что стандарт C99 и сам C++ позволяет объявлять и инициализировать переменные в цикле.
Но что это будет значить?
Постоянная работа с запросом\освобождением памяти?
Или оптимизация компилятора путём вынесения объявления за тело цикла?
Если так, то что он сделает со ссылками? Превратит их в указатели?

Помогите глубоко разобраться в этой теме. Зло или хорошая практика?
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.10.2016, 03:20
Ответы с готовыми решениями:

Объявление переменной в цикле
for (int i=0; i!=5; ++i) { int tmp; std::cout << &tmp << std::endl; } Будет ли переменная tmp объявляться при каждой...

Оптимизация запросов. Запросы в цикле - зло
Здравствуйте. При написании скрипта столкнулся с проблемой выборки по циклу. Скрипт работает очень медленно из за большого количества...

Объявление переменных в цикле
Такой код for i := 1 to 10 do begin var j: Integer := 10; end; Вопрос - всякий раз в памяти выделается 2 байта под...

35
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
22.11.2021, 22:18
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Optimus11 Посмотреть сообщение
my_string[4] = std::to_string(i)[0];
Эт ты чо изобразить хотел? 0_o

Цитата Сообщение от Optimus11 Посмотреть сообщение
Если да, то почему их "ни в конем случае нельзя обвалять "заранее"" ?
Объявляются как можно ближе к месту использования.
Всякое
C++
1
2
3
int main()
{
    double a, b, c, d cound, size, clock, smoothies;
- это параша голимая, которая непонятна сначала и забыта при появлении; а между этим нафиг не нужна.

Цитата Сообщение от Optimus11 Посмотреть сообщение
//То есть при создании функции - создаю указатель один раз, а не каждый раз, как вызывается функция.
Всунь в ф-ю.

С другими типами (в частности и с многими контейнерами STL) нужно уже голову включать и оценивать где и когда нужна скорость/память, т.к. выделение памяти в куче затратно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
 
struct POD
{
    double x { 15. };
    int y { 11 };
    char c { 'B' };
};
 
struct Heap
{
    int* p { nullptr };
    Heap() : p { new int } {}
    ~Heap() { if(p) delete p; }
};
 
int main()
{
    constexpr size_t n { 10 };
 
    for(size_t i { 0 }; i < n; ++i)
    {
        POD pod { 1, 2, 3 }; // OK
        Heap heap; //Not OK
        //work with pod & heap
    }
 
    { // <<<!!
        Heap heap; //maybe
        for(size_t i { 0 }; i < n; ++i)
        {
            POD pod { 1, 2, 3 }; // OK
            //work with pod & heap
        }
        //heap removed somewhere here
    } // <<<!!
 
    Heap heap; //maybe
    for(size_t i { 0 }; i < n; ++i)
    {
        POD pod { 1, 2, 3 }; // OK
        //work with pod & heap
    }
    //heap lives until the end
 
    return 0;
}
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
22.11.2021, 23:00
Цитата Сообщение от Folian Посмотреть сообщение
Всунь в ф-ю.
Так почему всунуть то в функцию ? Я об этом и спрашиваю, разница то в чем ? Между объявлением статичной переменной один раз, и объявлением каждый раз при вызове функции.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.11.2021, 23:47
Цитата Сообщение от Optimus11 Посмотреть сообщение
разница то в чем ? Между объявлением статичной переменной один раз, и объявлением каждый раз при вызове функции.
нет никаких "объявлений каждый раз при вызове функции".

"объявления" существуют только на уровне исходного кода.

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


в рантайме речь идет о создании объектов.
тобишь: о затратах на выделение памяти под объект,
и его инициализацию (или присвоение)

ну так вот,
выделение памяти для примитивного объекта на стеке - бесплатно.
поэтому, можешь смело объявлять указатели на стеке функции,
не опасаясь, что на их создание будет затрачиваться время.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
23.11.2021, 00:24
Цитата Сообщение от hoggy Посмотреть сообщение
выделение памяти для примитивного объекта на стеке - бесплатно.
поэтому, можешь смело объявлять указатели на стеке функции,
не опасаясь, что на их создание будет затрачиваться время.
Спасибо.
Но, тогда, если нет разницы, то почему TheCaligrapher написал, что такие перенные ни в коем соучае нельзя обьявлять "заранее" ?

Если выделение памяти на стеке для примитивного обтекта бесплатно, то какая ращница заранее я его выделю или не заранее ?
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
23.11.2021, 00:37


Добавлено через 2 минуты
Да как вы эти картинки вставляете-то??

Добавлено через 16 секунд
О! Сама вставилась!

Добавлено через 3 минуты
Цитата Сообщение от Optimus11 Посмотреть сообщение
Если выделение памяти на стеке для примитивного обтекта бесплатно, то какая ращница заранее я его выделю или не заранее ?
В одном случае ты минимум намусоришь, а в другом - нет.
3
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
23.11.2021, 00:38
Гифка огонь! Реквестую почаще таких!
1
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
23.11.2021, 01:00
Цитата Сообщение от _Ivana Посмотреть сообщение
Гифка огонь! Реквестую почаще таких!
Да можешь и сам поделать; мне Верёвкин инструмент подогнал - ScreenToGif называется.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.11.2021, 02:14
Цитата Сообщение от Optimus11 Посмотреть сообщение
почему TheCaligrapher написал, что такие перенные ни в коем соучае нельзя обьявлять "заранее" ?
потому что у него не только с чаем беда, но и с мозгами.

есть правило хорошего тона, которое гласит:
"объявляй переменные по месту использования".

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

Цитата Сообщение от Optimus11 Посмотреть сообщение
Если выделение памяти на стеке для примитивного обтекта бесплатно, то какая ращница заранее я его выделю или не заранее ?
ты опять понятия попутал.
за выделение памяти под стековый объект отвечает компилятор.
ты сам ничего не выделяешь, и не решаешь.

ты можешь объявить локальную переменную примитивного типа где-нибудь в начале функции.
(это считается плохим тоном).

или непосредственно перед использованием.
(это считается хорошим тоном).

с технической точки зрения, разницы нет.
но с точки зрения читабельности и сопровождения,
разница заключается в том, что писать в плохом тоне,
значит провоцировать говнокод.
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
23.11.2021, 02:32
А можно пойти дальше, и поиграть в ручного оптимизатора, думая, что компилятор тупой - объявить в начале функции минимально необходимое число переменных, и использовать их в теле функции под различные нужды. Например, переменную счетчика всех последовательных циклов. Но любой оптимизирующий компилятор и так сам все это поймет и сгенерирует тот же самый кот, что и если объявлять их внутри каждого цикла локально.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
23.11.2021, 07:10
Цитата Сообщение от Optimus11 Посмотреть сообщение
Если выделение памяти на стеке для примитивного обтекта бесплатно, то какая ращница заранее я его выделю или не заранее ?
Вот это вот "платно"/"бесплатно" - это символ какое-то юной наивной чайниковости. Какая разница "платно" оно или "бесплатно" и зачем это вообще сюда приплетено? "Платно"/"бесплатно" не имеет никакого значения и никого не интересует.

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

Все. Тема закрыта.

Это как в том анекдоте, про артиллерийский салют: "Адмирал, я подготовил список из 100 причин, по которой мы не выполнили артиллерийский салют в вашу честь. Номер один: у нас нет пушек..." Вот так же и здесь. Можно придумать как минимум 100 причин, по которым переменные следует объявлять максимально локально, но первой из них, которую я привел выше, уже более чем достаточно.

Если это кому-то не кажется убедительным аргументом, это говорит о том, что это вопрос maturity: до некоторых вещей нужно просто дорасти. И никакое вдалбливание не поможет, пока человек не дорастет.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
23.11.2021, 09:14
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот это вот "платно"/"бесплатно" - это символ какое-то юной наивной чайниковости. Какая разница "платно" оно или "бесплатно" и зачем это вообще сюда приплетено? "Платно"/"бесплатно" не имеет никакого значения и никого не интересует.
А че вы меня спрашиваете ? Вы прекрасно видели, что я отвечал и спрашивал об этом Hoggy. У вас за время раоботы программистом на столько зрение упало, что вы уже не в состоянии различать черные символы на белом фоне прямо перед собой ?


Вы взяли на себя право, написать:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
...ни в конем случае нельзя объявлять "заранее"...
Как будто бы есть именно "физическая" причина этому.

На проверку эта
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
основная причина
Оказалось, какой то игрой вашего воображения и псевдо-философией - сначала выставленная, как какая то реальная физическая величина за которую "ни в коем случае" нельзя выходить, а в итоге получилось, что:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
...до некоторых вещей нужно просто дорасти...
это связано с философской растишкой какой то.

Наверное вы перепутали раздел по программированию и философии.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Все. Тема закрыта.
0
23.11.2021, 11:07

Не по теме:

Folian, Дементий красавец, как всегда. :D

0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
23.11.2021, 13:26
Optimus11, объявлять "заранее" можно и нужно, если этому есть причина. Например в цикле считается сумма - значит переменная-сумма должна быть объявлена перед циклом (потому что она нужна после цикла).
Т.е. объявлять заранее без причины просто нет смысла.
Тут в первую очередь страдают выразительные свойства вашего кода. Компилятору все равно, а человеку нет. И человек может подумать, предположить, что раз переменная вынесена за цикл, значит нужна еще для чего-то. А это лишние телодвижения, по проверке этого предположения. Это же относится к "при максимально локальном объявлении переменных в объявлении практически всегда удается указать осмысленный инициализатор" для переменных скалярных типов. "Осмысленный" инициализатор - это прямое указание на то с каким значением предстоит работать дальше по коду, также это показатель достаточности начальных данных для дальнейших вычислений. Вся конструкция выглядит целостной, с ней уже можно работать и в целом понятно для чего она.

Еще можно привести пример, с которым, я думаю, сталкивался каждый человек хоть с каким-то образованием. Бывает, что в учебной литературе авторы любят злоупотреблять ссылками "вперед" книги. Т.е. вот, дескать, некое понятие, вы его запомните, а разберем мы его в 22 главе. Если таких отсылок "вперед" становится слишком много, то читатель скоро запутается. Собственно "осмысленный инициализатор" - это как дать понятие и его определение сразу же; при этом отдельных усилий стоит сделать так, чтобы данных для этого было достаточно в этом месте. Т.е. мы здесь сразу решаем две проблемы: вводим понятие с известным контекстом и делаем это там, где оно логически больше всего уместно, а не через 22 главы (если такое нужно слишком часто, то возможно просто стоило бы переработать структуру книги).
Не знаю, будут ли понятны вам эти параллели, но я надеюсь, что да.

Вся "философия" заключается в том, что программист - это не только инженер, но еще и писатель. Это работа на стыке дисциплин, и она должна, в идеале, учитывать особенности обеих (в необходимом для решения задачи количестве, естественно).
3
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
23.11.2021, 14:44
Проверил - код и говнокод работают одинаково.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
23.11.2021, 16:24
Цитата Сообщение от alexu_007 Посмотреть сообщение
Проверил - код и говнокод работают одинаково.
Одинаково хорошо или одинаково плохо?
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
23.11.2021, 19:52
Одинаково по времени.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.11.2021, 19:52

Объявление переменых в цикле for
Доброго времени суток! Я начинающий программист. Собственно поэтому и пишу сюда.) В данный момент изучаю массивы. #include...

Объявление переменных в цикле
Кусок кода: static int ix = 0; for (;;) { for (ix = 0; ix &lt; 6; ix++) { array_of_drugs = sex_wyth_bcd(ix); } OS_Delay(128); } ...

Объявление переменных в цикле for
Доброго дня всем!:) Продолжаю изучать C#. Начал разбирать свой текстовый файлик с &quot;вопросами&quot; и вот: Как работает...

Динамическое объявление массивов в цикле
Добрый день Подскажите пожалуйста, как в VBA объявлять динамически массивы типа variant Dim element As Variant group =...

Объявление заранее неизвестного количество методов в цикле
Добрый день! Как можно сделать так, чтобы в зависимости от введенного параметра, объявлялось определенное кол-во похожих методов,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru