Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/40: Рейтинг темы: голосов - 40, средняя оценка - 5.00
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
1

Создание переменных в цикле

11.08.2013, 21:45. Показов 8387. Ответов 16
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
void Camera::Render()
{
int a = ...;
int b = ...;
.....
}
делать

C++
1
2
3
4
5
6
void Camera::Render()
{
this->a=...;
this->b=...;
.....
}
создавая переменные заранее в классе
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.08.2013, 21:45
Ответы с готовыми решениями:

Создание переменных в цикле
Здравствуйте. Возможно ли сделать как-то так? ... for (int i=1; i < 10; i++) { ... int a...

Время жизни локальных переменных в цикле
Добрый вечер! допустим, в таком коде: int i=100; while(i>0) { int t = i+1; ... ...

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

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

16
433 / 368 / 149
Регистрация: 06.08.2012
Сообщений: 961
11.08.2013, 21:50 2
лучше обьявлять вне цикла.
0
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
11.08.2013, 21:55 3
Для повышения производительности лучше объявлять вне цикла.
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
11.08.2013, 21:55 4
В этом конкретном случае смысла нет, выделение памяти под все автоматические переменные в функции(блока) происходит одним смещением указателя на вершину стека. Более того, размазывание переменных по памяти может привести к неэффективному использованию кэша.
Но вот если бы так были не int'ы, а какие-нибудь сложные типы с конструкторами... Ну, собственно, эти самые конструкторы необходимо было бы вызывать каждый раз.
1
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
11.08.2013, 21:56 5
Цитата Сообщение от Raali Посмотреть сообщение
есть функция рендеринга, которая выполняется несколько сотен раз в секунду
а какой смысл? Если это графическое приложение, какой смысл оптимизировать что-то в нём ради fps>200 ?
Цитата Сообщение от Raali Посмотреть сообщение
int a = ...;
int b = ...;
И что? Всё выделение локальных переменных на стеке, сколько бы этих переменных ни было, занимает ровно одну инструкцию процессора
sub esp, N;//положить на стек N байт
Да, конечно, время могут отнять постоянные вызовы конструкторов и деструкторов, если эти переменные - объекты классов. Но оптимизировать тут нечего!
1
444 / 348 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 22:12 6
Цитата Сообщение от NoMasters Посмотреть сообщение
происходит одним смещением указателя на вершину стека
вроде выполняется проход по адресам свободных мест под переменную в стеке, например, создание и доступ к объектам в c#(.NET) быстрее чем в c++, потому что в управляемой куче (.net) как раз мы получаем вершину стека для выделения памяти.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
11.08.2013, 22:14 7
Цитата Сообщение от za5 Посмотреть сообщение
вроде выполняется проход по адресам свободных мест под переменную в стеке, например, создание и доступ к объектам в c#(.NET) быстрее чем в c++, потому что в управляемой куче (.net) как раз мы получаем вершину стека для выделения памяти.
что за бред? какой проход? "стек" это такая штука, которая позволяет выделять память только на своей вершине.
0
444 / 348 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 22:16 8
Kuzia domovenok, а когда память от переменной очищается возникают дыры. выделение памяти под переменные учитывает адреса дыр.
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
11.08.2013, 22:16 9
Цитата Сообщение от za5 Посмотреть сообщение
вроде выполняется проход по адресам свободных мест под переменную в стеке
Што? Как вы себе представляете свободное место в стеке?
0
444 / 348 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 22:19 10
Цитата Сообщение от NoMasters Посмотреть сообщение
Как вы себе представляете свободное место в стеке?
нет указателя на какую-то непрерывную область
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
11.08.2013, 22:20 11
Цитата Сообщение от za5 Посмотреть сообщение
Kuzia domovenok, а когда память от переменной очищается возникают дыры. выделение памяти под переменные учитывает адреса дыр.
а мы говорим про память под локальные, "авто" переменные. А ты говоришь про нечто похожее на динамическое выделение памяти в куче. Ты ничего не попутал?
Авто переменные вовсю используют стек, то есть поднимают его вершину при заходе в функцию, и опускают назад при выходе.
При этом соблюдается правило LIFO, и никакой вложенный вызов функции не способен его нарушить. Вот и дыр не бывает.
Всегда удаляются переменные только из последней вызванной функции. (Я наверное не очень понятно своими словами объясняю?)
1
444 / 348 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 22:26 12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ты ничего не попутал?
верно) я про кучу говорил
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
11.08.2013, 22:32 13
Дыр в памяти не возникает, так как переменные удаляются в строго определённом порядке. LIFO "первым вставлен - последним вынут".
Не может возникнуть проблемы образования "дыр", т.к. если некая локальная переменная закончила своё время жизни, то это значит, что и все локальные переменные в этом блоке точно также его закончили. А лок.переменные, создававшиеся во всех подблоках (вложенных вызовах функций) тем более закончили время жизни ещё раньше! То есть "удалить из середины" что-то просто нереально на стеке.
Либо переменная существует, либо удаляется и она и всё что над ней вплоть до вершины.
0
444 / 348 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 22:39 14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Дыр в памяти не возникает, так как переменные удаляются в строго определённом порядке.
то есть если мы в выделили 10МБ на несколько переменных, потом ещё 50 и ещё 10. затем решили избавиться от объектов что занимают 50... т.е. должна остаться дырка в куче на 50мб, потому что остальные адреса. не меняются после удаления. а если затем решим добавить ещё 20 мб переменных. то в стек запишутся новые адреса которые с большой вероятностьюбудут указывать на вырезанную область в куче.
То есть "удалить из середины" что-то просто нереально на стеке.
я не говорю что это реально
0
8 / 8 / 1
Регистрация: 09.08.2013
Сообщений: 68
11.08.2013, 22:43 15
Память выделенная в стеке статическая,и с нее нельзя ничего убирать-удалять.
Объявления int a=15;int b=16; работают со стеком
Другое дело,если память мы выделяем динамически в кучу:
int *a=new int [n];
2
444 / 348 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 23:50 16
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
а мы говорим про память под локальные, "авто" переменные.Авто переменные вовсю используют стек
ясно. тогда да.
Добавлено через 50 минут
Цитата Сообщение от fatalis Посмотреть сообщение
Другое дело,если память мы выделяем динамически в кучу:
int *a=new int [n];
я как раз об этих случаях говорил.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
12.08.2013, 02:02 17
Цитата Сообщение от Raali Посмотреть сообщение
стоит ли выносить временные переменные за функцию, или это практически не имеет смысла? например вместо

C++
1
2
3
4
5
6
void Camera::Render()
{
int a = ...;
int b = ...;
.....
}
делать

C++
1
2
3
4
5
6
void Camera::Render()
{
this->a=...;
this->b=...;
.....
}
создавая переменные заранее в классе
При использовании локальных переменных компилятор вообще не обязан нигде ничего создавать.
Он может поместить переменные в регистры процессора и распоряжаться ими так, как ему "вздумается".
В этом смысле локальные переменные немного в выигрыше по сравнению с переменными класса,
так как для последних рано или поздно нужно форсить чтение-запись в память, а это промахи
кэша, пейдж-фолты и прочие "ужасы".

Впрочем, все это микрооптимизация, а не имея перед глазами полного кода функции,
ничего утверждать наверняка нельзя.
1
12.08.2013, 02:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.08.2013, 02:02
Помогаю со студенческими работами здесь

Какую запись переменных в цикле for лучше использовать?
Какую запись переменных в цикле for лучше использовать? 1) for(int i = 1; i <= 12; i++) 2)...

Можно ли в цикле for объявить две переменных разного типа?
Есть такой цикл for(сhar s='A',int i=0; s<'Z'; s++,i++) {} Builder 6 выдает ошибки : ...

Создание переменных в цикле
Подскажите пожалуйста как в теле цикла создать переменные и записать туда данные мне нужно типа...

Создание переменных новых переменных в процессе работы программы
Как создать переменные в процессе работы программы. И желательно по такому коду: program a8;...

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

Присваивание переменных в цикле
Доброго времени суток! может быть тему не так назвал, ну да ладно ) Суть: Есть форма. В цикле...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru