Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,068
Завершенные тесты: 1
#1

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

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

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2013, 21:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание переменных в цикле (C++):

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

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

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

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

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

Создание файлов в цикле? (с++) - C++
Добрый день! Необходимо реализовать в программе создание большого количество файлов, но пока не знаю как это можно организовать. ...

16
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
11.08.2013, 21:50 #2
лучше обьявлять вне цикла.
0
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
11.08.2013, 21:55 #3
Для повышения производительности лучше объявлять вне цикла.
0
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
11.08.2013, 21:55 #4
В этом конкретном случае смысла нет, выделение памяти под все автоматические переменные в функции(блока) происходит одним смещением указателя на вершину стека. Более того, размазывание переменных по памяти может привести к неэффективному использованию кэша.
Но вот если бы так были не int'ы, а какие-нибудь сложные типы с конструкторами... Ну, собственно, эти самые конструкторы необходимо было бы вызывать каждый раз.
1
Kuzia domovenok
1951 / 1804 / 140
Регистрация: 25.03.2012
Сообщений: 6,247
Записей в блоге: 1
11.08.2013, 21:56 #5
Цитата Сообщение от Raali Посмотреть сообщение
есть функция рендеринга, которая выполняется несколько сотен раз в секунду
а какой смысл? Если это графическое приложение, какой смысл оптимизировать что-то в нём ради fps>200 ?
Цитата Сообщение от Raali Посмотреть сообщение
int a = ...;
int b = ...;
И что? Всё выделение локальных переменных на стеке, сколько бы этих переменных ни было, занимает ровно одну инструкцию процессора
sub esp, N;//положить на стек N байт
Да, конечно, время могут отнять постоянные вызовы конструкторов и деструкторов, если эти переменные - объекты классов. Но оптимизировать тут нечего!
1
za5
442 / 346 / 30
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 22:12 #6
Цитата Сообщение от NoMasters Посмотреть сообщение
происходит одним смещением указателя на вершину стека
вроде выполняется проход по адресам свободных мест под переменную в стеке, например, создание и доступ к объектам в c#(.NET) быстрее чем в c++, потому что в управляемой куче (.net) как раз мы получаем вершину стека для выделения памяти.
0
Kuzia domovenok
1951 / 1804 / 140
Регистрация: 25.03.2012
Сообщений: 6,247
Записей в блоге: 1
11.08.2013, 22:14 #7
Цитата Сообщение от za5 Посмотреть сообщение
вроде выполняется проход по адресам свободных мест под переменную в стеке, например, создание и доступ к объектам в c#(.NET) быстрее чем в c++, потому что в управляемой куче (.net) как раз мы получаем вершину стека для выделения памяти.
что за бред? какой проход? "стек" это такая штука, которая позволяет выделять память только на своей вершине.
0
za5
442 / 346 / 30
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 22:16 #8
Kuzia domovenok, а когда память от переменной очищается возникают дыры. выделение памяти под переменные учитывает адреса дыр.
0
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
11.08.2013, 22:16 #9
Цитата Сообщение от za5 Посмотреть сообщение
вроде выполняется проход по адресам свободных мест под переменную в стеке
Што? Как вы себе представляете свободное место в стеке?
0
za5
442 / 346 / 30
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 22:19 #10
Цитата Сообщение от NoMasters Посмотреть сообщение
Как вы себе представляете свободное место в стеке?
нет указателя на какую-то непрерывную область
0
Kuzia domovenok
1951 / 1804 / 140
Регистрация: 25.03.2012
Сообщений: 6,247
Записей в блоге: 1
11.08.2013, 22:20 #11
Цитата Сообщение от za5 Посмотреть сообщение
Kuzia domovenok, а когда память от переменной очищается возникают дыры. выделение памяти под переменные учитывает адреса дыр.
а мы говорим про память под локальные, "авто" переменные. А ты говоришь про нечто похожее на динамическое выделение памяти в куче. Ты ничего не попутал?
Авто переменные вовсю используют стек, то есть поднимают его вершину при заходе в функцию, и опускают назад при выходе.
При этом соблюдается правило LIFO, и никакой вложенный вызов функции не способен его нарушить. Вот и дыр не бывает.
Всегда удаляются переменные только из последней вызванной функции. (Я наверное не очень понятно своими словами объясняю?)
1
za5
442 / 346 / 30
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 22:26 #12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ты ничего не попутал?
верно) я про кучу говорил
0
Kuzia domovenok
1951 / 1804 / 140
Регистрация: 25.03.2012
Сообщений: 6,247
Записей в блоге: 1
11.08.2013, 22:32 #13
Дыр в памяти не возникает, так как переменные удаляются в строго определённом порядке. LIFO "первым вставлен - последним вынут".
Не может возникнуть проблемы образования "дыр", т.к. если некая локальная переменная закончила своё время жизни, то это значит, что и все локальные переменные в этом блоке точно также его закончили. А лок.переменные, создававшиеся во всех подблоках (вложенных вызовах функций) тем более закончили время жизни ещё раньше! То есть "удалить из середины" что-то просто нереально на стеке.
Либо переменная существует, либо удаляется и она и всё что над ней вплоть до вершины.
0
za5
442 / 346 / 30
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 22:39 #14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Дыр в памяти не возникает, так как переменные удаляются в строго определённом порядке.
то есть если мы в выделили 10МБ на несколько переменных, потом ещё 50 и ещё 10. затем решили избавиться от объектов что занимают 50... т.е. должна остаться дырка в куче на 50мб, потому что остальные адреса. не меняются после удаления. а если затем решим добавить ещё 20 мб переменных. то в стек запишутся новые адреса которые с большой вероятностьюбудут указывать на вырезанную область в куче.
То есть "удалить из середины" что-то просто нереально на стеке.
я не говорю что это реально
0
fatalis
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
11.08.2013, 22:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2013, 22:43
Привет! Вот еще темы с ответами:

Создание объектов в цикле! - C++
Подскажите пожалуйста как в цикле создать несколько одинаковых объектов, но с разными именами, либо как-нибудь, чтобы можно было их...

Создание нескольких массивов в цикле - C++
Возможно ли в цикле создать энное количество массивов? Например while(n!=20) {new arr<n>} Что то на подобие этого. В java это...

Создание объектов в цикле по заданному числу - C++
Можно ли создавать объекты класса по заданному числу в цикле? Проще говоря можно ли в С++ как то реализовать следующее: cout << "Введите...

Автоматическое создание переменной с определённым именем в цикле - C++
Например, нужно чтобы с каждым шагом цикла, создавалась переменная a1, a2, a3 и так далее


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru