|
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313
|
|
Объявление переменной в цикле - зло?29.10.2016, 03:20. Показов 48375. Ответов 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
|
|
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,320
|
||
| 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
|
|
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|
| 23.11.2021, 13:26 | |
|
Optimus11, объявлять "заранее" можно и нужно, если этому есть причина. Например в цикле считается сумма - значит переменная-сумма должна быть объявлена перед циклом (потому что она нужна после цикла).
Т.е. объявлять заранее без причины просто нет смысла. Тут в первую очередь страдают выразительные свойства вашего кода. Компилятору все равно, а человеку нет. И человек может подумать, предположить, что раз переменная вынесена за цикл, значит нужна еще для чего-то. А это лишние телодвижения, по проверке этого предположения. Это же относится к "при максимально локальном объявлении переменных в объявлении практически всегда удается указать осмысленный инициализатор" для переменных скалярных типов. "Осмысленный" инициализатор - это прямое указание на то с каким значением предстоит работать дальше по коду, также это показатель достаточности начальных данных для дальнейших вычислений. Вся конструкция выглядит целостной, с ней уже можно работать и в целом понятно для чего она. Еще можно привести пример, с которым, я думаю, сталкивался каждый человек хоть с каким-то образованием. Бывает, что в учебной литературе авторы любят злоупотреблять ссылками "вперед" книги. Т.е. вот, дескать, некое понятие, вы его запомните, а разберем мы его в 22 главе. Если таких отсылок "вперед" становится слишком много, то читатель скоро запутается. Собственно "осмысленный инициализатор" - это как дать понятие и его определение сразу же; при этом отдельных усилий стоит сделать так, чтобы данных для этого было достаточно в этом месте. Т.е. мы здесь сразу решаем две проблемы: вводим понятие с известным контекстом и делаем это там, где оно логически больше всего уместно, а не через 22 главы (если такое нужно слишком часто, то возможно просто стоило бы переработать структуру книги). Не знаю, будут ли понятны вам эти параллели, но я надеюсь, что да. Вся "философия" заключается в том, что программист - это не только инженер, но еще и писатель. Это работа на стыке дисциплин, и она должна, в идеале, учитывать особенности обеих (в необходимом для решения задачи количестве, естественно).
3
|
|
|
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,337
|
|
| 23.11.2021, 14:44 | |
|
Проверил - код и говнокод работают одинаково.
0
|
|
|
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,337
|
|
| 23.11.2021, 19:52 | |
|
Одинаково по времени.
0
|
|
| 23.11.2021, 19:52 | |
|
Объявление переменных в цикле Объявление переменных в цикле for Динамическое объявление массивов в цикле Объявление заранее неизвестного количество методов в цикле Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|