Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
11.08.2013, 21:45     Создание переменных в цикле #1
Здравствуйте, меня интересует вопрос - насколько операция создания переменных быстра.
есть функция рендеринга, которая выполняется несколько сотен раз в секунду, стоит ли выносить временные переменные за функцию, или это практически не имеет смысла? например вместо

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=...;
.....
}
создавая переменные заранее в классе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
11.08.2013, 21:50     Создание переменных в цикле #2
лучше обьявлять вне цикла.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
11.08.2013, 21:55     Создание переменных в цикле #3
Для повышения производительности лучше объявлять вне цикла.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
11.08.2013, 21:55     Создание переменных в цикле #4
В этом конкретном случае смысла нет, выделение памяти под все автоматические переменные в функции(блока) происходит одним смещением указателя на вершину стека. Более того, размазывание переменных по памяти может привести к неэффективному использованию кэша.
Но вот если бы так были не int'ы, а какие-нибудь сложные типы с конструкторами... Ну, собственно, эти самые конструкторы необходимо было бы вызывать каждый раз.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
11.08.2013, 21:56     Создание переменных в цикле #5
Цитата Сообщение от Raali Посмотреть сообщение
есть функция рендеринга, которая выполняется несколько сотен раз в секунду
а какой смысл? Если это графическое приложение, какой смысл оптимизировать что-то в нём ради fps>200 ?
Цитата Сообщение от Raali Посмотреть сообщение
int a = ...;
int b = ...;
И что? Всё выделение локальных переменных на стеке, сколько бы этих переменных ни было, занимает ровно одну инструкцию процессора
sub esp, N;//положить на стек N байт
Да, конечно, время могут отнять постоянные вызовы конструкторов и деструкторов, если эти переменные - объекты классов. Но оптимизировать тут нечего!
za5
440 / 344 / 30
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 22:12     Создание переменных в цикле #6
Цитата Сообщение от NoMasters Посмотреть сообщение
происходит одним смещением указателя на вершину стека
вроде выполняется проход по адресам свободных мест под переменную в стеке, например, создание и доступ к объектам в c#(.NET) быстрее чем в c++, потому что в управляемой куче (.net) как раз мы получаем вершину стека для выделения памяти.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
11.08.2013, 22:14     Создание переменных в цикле #7
Цитата Сообщение от za5 Посмотреть сообщение
вроде выполняется проход по адресам свободных мест под переменную в стеке, например, создание и доступ к объектам в c#(.NET) быстрее чем в c++, потому что в управляемой куче (.net) как раз мы получаем вершину стека для выделения памяти.
что за бред? какой проход? "стек" это такая штука, которая позволяет выделять память только на своей вершине.
za5
440 / 344 / 30
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 22:16     Создание переменных в цикле #8
Kuzia domovenok, а когда память от переменной очищается возникают дыры. выделение памяти под переменные учитывает адреса дыр.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
11.08.2013, 22:16     Создание переменных в цикле #9
Цитата Сообщение от za5 Посмотреть сообщение
вроде выполняется проход по адресам свободных мест под переменную в стеке
Што? Как вы себе представляете свободное место в стеке?
za5
440 / 344 / 30
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 22:19     Создание переменных в цикле #10
Цитата Сообщение от NoMasters Посмотреть сообщение
Как вы себе представляете свободное место в стеке?
нет указателя на какую-то непрерывную область
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
11.08.2013, 22:20     Создание переменных в цикле #11
Цитата Сообщение от za5 Посмотреть сообщение
Kuzia domovenok, а когда память от переменной очищается возникают дыры. выделение памяти под переменные учитывает адреса дыр.
а мы говорим про память под локальные, "авто" переменные. А ты говоришь про нечто похожее на динамическое выделение памяти в куче. Ты ничего не попутал?
Авто переменные вовсю используют стек, то есть поднимают его вершину при заходе в функцию, и опускают назад при выходе.
При этом соблюдается правило LIFO, и никакой вложенный вызов функции не способен его нарушить. Вот и дыр не бывает.
Всегда удаляются переменные только из последней вызванной функции. (Я наверное не очень понятно своими словами объясняю?)
za5
440 / 344 / 30
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 22:26     Создание переменных в цикле #12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ты ничего не попутал?
верно) я про кучу говорил
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
11.08.2013, 22:32     Создание переменных в цикле #13
Дыр в памяти не возникает, так как переменные удаляются в строго определённом порядке. LIFO "первым вставлен - последним вынут".
Не может возникнуть проблемы образования "дыр", т.к. если некая локальная переменная закончила своё время жизни, то это значит, что и все локальные переменные в этом блоке точно также его закончили. А лок.переменные, создававшиеся во всех подблоках (вложенных вызовах функций) тем более закончили время жизни ещё раньше! То есть "удалить из середины" что-то просто нереально на стеке.
Либо переменная существует, либо удаляется и она и всё что над ней вплоть до вершины.
za5
440 / 344 / 30
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 22:39     Создание переменных в цикле #14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Дыр в памяти не возникает, так как переменные удаляются в строго определённом порядке.
то есть если мы в выделили 10МБ на несколько переменных, потом ещё 50 и ещё 10. затем решили избавиться от объектов что занимают 50... т.е. должна остаться дырка в куче на 50мб, потому что остальные адреса. не меняются после удаления. а если затем решим добавить ещё 20 мб переменных. то в стек запишутся новые адреса которые с большой вероятностьюбудут указывать на вырезанную область в куче.
То есть "удалить из середины" что-то просто нереально на стеке.
я не говорю что это реально
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];
za5
440 / 344 / 30
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
11.08.2013, 23:50     Создание переменных в цикле #16
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
а мы говорим про память под локальные, "авто" переменные.Авто переменные вовсю используют стек
ясно. тогда да.
Добавлено через 50 минут
Цитата Сообщение от fatalis Посмотреть сообщение
Другое дело,если память мы выделяем динамически в кучу:
int *a=new int [n];
я как раз об этих случаях говорил.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2013, 02:02     Создание переменных в цикле
Еще ссылки по теме:

C++ Какую запись переменных в цикле for лучше использовать?
C++ Создание переменных в цикле

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

Или воспользуйтесь поиском по форуму:
Убежденный
Системный программист
 Аватар для Убежденный
14208 / 6223 / 987
Регистрация: 02.05.2013
Сообщений: 10,368
Завершенные тесты: 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=...;
.....
}
создавая переменные заранее в классе
При использовании локальных переменных компилятор вообще не обязан нигде ничего создавать.
Он может поместить переменные в регистры процессора и распоряжаться ими так, как ему "вздумается".
В этом смысле локальные переменные немного в выигрыше по сравнению с переменными класса,
так как для последних рано или поздно нужно форсить чтение-запись в память, а это промахи
кэша, пейдж-фолты и прочие "ужасы".

Впрочем, все это микрооптимизация, а не имея перед глазами полного кода функции,
ничего утверждать наверняка нельзя.
Yandex
Объявления
12.08.2013, 02:02     Создание переменных в цикле
Ответ Создать тему
Опции темы

Текущее время: 01:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru