Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
49 / 2 / 0
Регистрация: 26.09.2014
Сообщений: 98

Время жизни локальных переменных в цикле

07.02.2017, 21:10. Показов 3720. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер! допустим, в таком коде:
C++
1
2
3
4
5
6
7
int i=100;
while(i>0)
{
   int t = i+1;
    ...
   --i;
}
переменная t определяется каждую итерацию (100 раз) или один раз до конца работы цикла? Если каждый раз определяется по новой, не легче ли его объявить вне цикла, чтобы лишних 100 раз не делать операций выделения памяти и очистки. И вообще стоит ли заморачиваться над такими мелочами?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.02.2017, 21:10
Ответы с готовыми решениями:

C++11 время жизни переменных
После долгого перерыва в программирование вновь спохватился и тут наткнулся на такую не ожиданность #include <iostream> ...

Время жизни переменных
Добрый вечер. у меня такая проблема. мне нужно перегрузить функцию для моего класса: numb numb::operator +(const numb &p)const { ...

Область видимости и время жизни переменных внутри класса
Есть класс, определение в файле myclass.h, реализация myclass.cpp Как и где правильно определить глобальную переменную, чтоб ее значение...

7
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
07.02.2017, 21:29
Цитата Сообщение от Maks53 Посмотреть сообщение
чтобы лишних 100 раз не делать операций выделения памяти и очистки
Не вдаваясь в подробности, память под локальные переменные выделяется 1 раз при входе в функцию. При чем выделяется на стеке (можно считать мгновенно). Если речь идет о примитивных типах - пофиг сколько раз они создадутся. Т.к. конструктор для них не вызывается, а значение им присваивать все равно надо. Если же речь идет о типах с "тяжелым" конструктором/деструктором - то разница есть.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,222
07.02.2017, 21:33
Лучший ответ Сообщение было отмечено Maks53 как решение

Решение

Цитата Сообщение от Maks53 Посмотреть сообщение
переменная t определяется каждую итерацию (100 раз) или один раз до конца работы цикла?
Каждую итерацию.

Цитата Сообщение от Maks53 Посмотреть сообщение
Если каждый раз определяется по новой, не легче ли его объявить вне цикла, чтобы лишних 100 раз не делать операций выделения памяти и очистки.
Переменная типа int - "бесплатная" переменная. Поэтому никакого смысла в подобных "ручных оптимизациях" тут нет.

Цитата Сообщение от Maks53 Посмотреть сообщение
И вообще стоит ли заморачиваться над такими мелочами?
В случаях типов с нетривиальной и "дорогой" инициализацией и/или деструкцией - иногда бывает, что стоит.
2
49 / 2 / 0
Регистрация: 26.09.2014
Сообщений: 98
07.02.2017, 21:42  [ТС]
avgoor, Т.е в цикле все же каждую итерацию определяется по новой? и если есть разница, нужно стараться не определять в теле цикла?
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
07.02.2017, 21:48
Maks53, Преждевременная оптимизация - корень всех бед.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,222
07.02.2017, 21:53
Цитата Сообщение от Maks53 Посмотреть сообщение
Т.е в цикле все же каждую итерацию определяется по новой? и если есть разница, нужно стараться не определять в теле цикла?
Если бы у вас инициализирующее значение для t было нетривиальным (например, вычисление факториала от i), то вычислять его "по новой" на каждой итерации цикла было бы расточительно. Лучше было бы накапливать это значение инкрементально от итерации к итерации. При этом, понятное дело, пришлось бы объявлять t за пределами цикла.

А в вашем же тривиальном случае - t = i + 1 - попытки что-то оптимизировать вручную скорее принесут вред, чем пользу, ибо могут помешать компилятору выполнить свои внутренние оптимизации, которые он в таких тривиальных случаях может и умеет делать намного лучше вас.
0
49 / 2 / 0
Регистрация: 26.09.2014
Сообщений: 98
07.02.2017, 21:54  [ТС]
avgoor, Спасибо, учту=)
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
07.02.2017, 22:29
Вот так это выглядит в "машинном" языке:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
;  int i = 100;
        mov     DWORD PTR [rbp-8], 100
; while(i > 0)
.L3:
        cmp     DWORD PTR [rbp-8], 0
        jle     .L2
; int t = i+1;
        mov     eax, DWORD PTR [rbp-8]; эта строчка считывает значение i в регистр(временная ячейка в процессоре)
        add     eax, 1; эта увеличивает значение в регистре
        mov     DWORD PTR [rbp-4], eax; вот тут значение из регистра записывается в t
; --i;
        sub     DWORD PTR [rbp-8], 1
        jmp     .L3
.L2:
Как видите, компилятор заранее выделил память под i и под t. Тоже самое он делает, если написать:
C++
1
2
3
4
5
6
7
int i=100;
        while(i>0)
        {
                int array[100];
                       
                --i;
        }
Но даже если б он не с оптимизировал, всё создание переменной на стеке сводилось бы к изменению одного специального регистра, к нему бы прибавилось количество байтов, занимаемых переменной, а это даже быстрее, чем ++i;
P.S. компилировал g++, другой компилятор может дать другой результат
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.02.2017, 22:29
Помогаю со студенческими работами здесь

Время жизни переменных
Паскаль замечательный тем, что в нем можно управлять памятью, но допустим в цикле: for i:=1 to 10 do Переменная будет жить все время...

Время жизни переменных Public
Всем привет, Я в VBA запустил процедуру, в которой переменным типа Public были присвоены некоторые значения. По идее эти переменные...

Время жизни переменных в разных формах
Помогите пожалуйста советом убогому! Не могу разобраться со временем жизни переменных в разных формах. У меня получается, что если в...

Продлить время жизни переменных (Public не работает)
В программе предусмотрена остановка, при возникновении к.л. отклонений в формате данных и пользователю предлагается изменить ошибку и...

Рассмотреть программу, написать имена глобальных переменных, локальных переменных, формальных параметров
Program P1; var s:string; procedure P(var s:string) ; var i, j : integer; aux: char; ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru