|
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313
|
|
Объявление переменной в цикле - зло?29.10.2016, 03:20. Показов 48317. Ответов 35
Метки нет (Все метки)
Во имя читаемости пришлось объявить и инициализировать ссылки на переменные и сами переменные в теле цикла.
Преподаватель против такой практики, но почему - внятно объяснить не может. Находил темы с большим холиваром по этому поводу, но ясной однозначности не нашёл. Читал, что стандарт C99 и сам C++ позволяет объявлять и инициализировать переменные в цикле. Но что это будет значить? Постоянная работа с запросом\освобождением памяти? Или оптимизация компилятора путём вынесения объявления за тело цикла? Если так, то что он сделает со ссылками? Превратит их в указатели? Помогите глубоко разобраться в этой теме. Зло или хорошая практика?
1
|
|
| 29.10.2016, 03:20 | |
|
Ответы с готовыми решениями:
35
Объявление переменной в цикле Оптимизация запросов. Запросы в цикле - зло
|
|
Гвоздь Задиров
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
|
||||||||||||||
| 22.11.2021, 22:18 | ||||||||||||||
|
Всякое
С другими типами (в частности и с многими контейнерами STL) нужно уже голову включать и оценивать где и когда нужна скорость/память, т.к. выделение памяти в куче затратно.
0
|
||||||||||||||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||
| 22.11.2021, 23:00 | ||
|
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 22.11.2021, 23:47 | ||
|
"объявления" существуют только на уровне исходного кода. момент вызова функции - это уже рантайм. в рантайме весь код уже давно скомпилирован, и никаких "объявлений" в этот момент не существует. в рантайме речь идет о создании объектов. тобишь: о затратах на выделение памяти под объект, и его инициализацию (или присвоение) ну так вот, выделение памяти для примитивного объекта на стеке - бесплатно. поэтому, можешь смело объявлять указатели на стеке функции, не опасаясь, что на их создание будет затрачиваться время.
1
|
||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||
| 23.11.2021, 00:24 | ||
|
Но, тогда, если нет разницы, то почему TheCaligrapher написал, что такие перенные ни в коем соучае нельзя обьявлять "заранее" ? Если выделение памяти на стеке для примитивного обтекта бесплатно, то какая ращница заранее я его выделю или не заранее ?
0
|
||
|
Гвоздь Задиров
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
|
||
| 23.11.2021, 00:37 | ||
![]() Добавлено через 2 минуты Да как вы эти картинки вставляете-то?? ![]() Добавлено через 16 секунд О! Сама вставилась! Добавлено через 3 минуты
3
|
||
|
Гвоздь Задиров
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
|
||
| 23.11.2021, 01:00 | ||
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 23.11.2021, 02:14 | |||
|
есть правило хорошего тона, которое гласит: "объявляй переменные по месту использования". теоретически, следование этому правилу позволяет писать более лучший код. однако, это вовсе не обязаловка. если не хочешь - можешь и не следовать. за выделение памяти под стековый объект отвечает компилятор. ты сам ничего не выделяешь, и не решаешь. ты можешь объявить локальную переменную примитивного типа где-нибудь в начале функции. (это считается плохим тоном). или непосредственно перед использованием. (это считается хорошим тоном). с технической точки зрения, разницы нет. но с точки зрения читабельности и сопровождения, разница заключается в том, что писать в плохом тоне, значит провоцировать говнокод.
1
|
|||
| 23.11.2021, 02:32 | |
|
А можно пойти дальше, и поиграть в ручного оптимизатора, думая, что компилятор тупой - объявить в начале функции минимально необходимое число переменных, и использовать их в теле функции под различные нужды. Например, переменную счетчика всех последовательных циклов. Но любой оптимизирующий компилятор и так сам все это поймет и сгенерирует тот же самый кот, что и если объявлять их внутри каждого цикла локально.
0
|
|
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
||
| 23.11.2021, 07:10 | ||
|
Я уже не раз приводил основную причину, по которой переменные следует объявлять максимально локально: при максимально локальном объявлении переменных в объявлении практически всегда удается указать осмысленный инициализатор. Все. Тема закрыта. Это как в том анекдоте, про артиллерийский салют: "Адмирал, я подготовил список из 100 причин, по которой мы не выполнили артиллерийский салют в вашу честь. Номер один: у нас нет пушек..." Вот так же и здесь. Можно придумать как минимум 100 причин, по которым переменные следует объявлять максимально локально, но первой из них, которую я привел выше, уже более чем достаточно. Если это кому-то не кажется убедительным аргументом, это говорит о том, что это вопрос maturity: до некоторых вещей нужно просто дорасти. И никакое вдалбливание не поможет, пока человек не дорастет.
0
|
||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||||||
| 23.11.2021, 09:14 | ||||||
|
Вы взяли на себя право, написать: На проверку эта Наверное вы перепутали раздел по программированию и философии.
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
|
|
|
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
|
|
| 23.11.2021, 19:52 | |
|
Одинаково по времени.
0
|
|
| 23.11.2021, 19:52 | |
|
Объявление переменных в цикле Объявление переменных в цикле for Динамическое объявление массивов в цикле Объявление заранее неизвестного количество методов в цикле Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запрет пометки на удаление и отмены проведения
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
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|