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

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

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

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

11.08.2013, 21:45. Просмотров 1742. Ответов 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=...;
.....
}
создавая переменные заранее в классе
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2013, 21:45     Создание переменных в цикле
Посмотрите здесь:

Создание переменных в цикле - 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++
Добрый день! Необходимо реализовать в программе создание большого количество файлов, но пока не знаю как это можно организовать. ...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
11.08.2013, 21:50     Создание переменных в цикле #2
лучше обьявлять вне цикла.
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
11.08.2013, 21:55     Создание переменных в цикле #3
Для повышения производительности лучше объявлять вне цикла.
NoMasters
Псевдослучайный
1747 / 1090 / 71
Регистрация: 13.09.2011
Сообщений: 3,121
11.08.2013, 21:55     Создание переменных в цикле #4
В этом конкретном случае смысла нет, выделение памяти под все автоматические переменные в функции(блока) происходит одним смещением указателя на вершину стека. Более того, размазывание переменных по памяти может привести к неэффективному использованию кэша.
Но вот если бы так были не int'ы, а какие-нибудь сложные типы с конструкторами... Ну, собственно, эти самые конструкторы необходимо было бы вызывать каждый раз.
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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
Псевдослучайный
1747 / 1090 / 71
Регистрация: 13.09.2011
Сообщений: 3,121
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
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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 мб переменных. то в стек запишутся новые адреса которые с большой вероятностьюбудут указывать на вырезанную область в куче.
То есть "удалить из середины" что-то просто нереально на стеке.
я не говорю что это реально
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2013, 22:43     Создание переменных в цикле
Еще ссылки по теме:

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

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

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

Динамическое создание переменных - C++
Есть строка введённая с клавиатуры пользователем, к примеру такая: "a+b+c", как создать динамические переменные, допустим типа int a, b,...

Создание переменных/объектов - C++
Здравствуйте, есть ли такая штука в C++: к примеру есть цикл, со счётчиком i, могу ли я как-то "прокрутив" цикл 10 раз, создать переменные...


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

Или воспользуйтесь поиском по форуму:
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];
Yandex
Объявления
11.08.2013, 22:43     Создание переменных в цикле
Ответ Создать тему
Опции темы

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