859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
|
|||||||||||
1 | |||||||||||
Создание переменных в цикле11.08.2013, 21:45. Показов 8387. Ответов 16
Метки нет (Все метки)
Здравствуйте, меня интересует вопрос - насколько операция создания переменных быстра.
есть функция рендеринга, которая выполняется несколько сотен раз в секунду, стоит ли выносить временные переменные за функцию, или это практически не имеет смысла? например вместо
0
|
11.08.2013, 21:45 | |
Ответы с готовыми решениями:
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
|
11.08.2013, 21:56 | 5 |
а какой смысл? Если это графическое приложение, какой смысл оптимизировать что-то в нём ради fps>200 ?
И что? Всё выделение локальных переменных на стеке, сколько бы этих переменных ни было, занимает ровно одну инструкцию процессора
sub esp, N;//положить на стек N байт Да, конечно, время могут отнять постоянные вызовы конструкторов и деструкторов, если эти переменные - объекты классов. Но оптимизировать тут нечего!
1
|
11.08.2013, 22:12 | 6 |
вроде выполняется проход по адресам свободных мест под переменную в стеке, например, создание и доступ к объектам в c#(.NET) быстрее чем в c++, потому что в управляемой куче (.net) как раз мы получаем вершину стека для выделения памяти.
0
|
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
|
|
11.08.2013, 22:16 | 9 |
0
|
11.08.2013, 22:20 | 11 |
а мы говорим про память под локальные, "авто" переменные. А ты говоришь про нечто похожее на динамическое выделение памяти в куче. Ты ничего не попутал?
Авто переменные вовсю используют стек, то есть поднимают его вершину при заходе в функцию, и опускают назад при выходе. При этом соблюдается правило LIFO, и никакой вложенный вызов функции не способен его нарушить. Вот и дыр не бывает. Всегда удаляются переменные только из последней вызванной функции. (Я наверное не очень понятно своими словами объясняю?)
1
|
11.08.2013, 22:32 | 13 |
Дыр в памяти не возникает, так как переменные удаляются в строго определённом порядке. LIFO "первым вставлен - последним вынут".
Не может возникнуть проблемы образования "дыр", т.к. если некая локальная переменная закончила своё время жизни, то это значит, что и все локальные переменные в этом блоке точно также его закончили. А лок.переменные, создававшиеся во всех подблоках (вложенных вызовах функций) тем более закончили время жизни ещё раньше! То есть "удалить из середины" что-то просто нереально на стеке. Либо переменная существует, либо удаляется и она и всё что над ней вплоть до вершины.
0
|
11.08.2013, 22:39 | 14 |
то есть если мы в выделили 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
|
Ушел с форума
|
|
12.08.2013, 02:02 | 17 |
При использовании локальных переменных компилятор вообще не обязан нигде ничего создавать.
Он может поместить переменные в регистры процессора и распоряжаться ими так, как ему "вздумается". В этом смысле локальные переменные немного в выигрыше по сравнению с переменными класса, так как для последних рано или поздно нужно форсить чтение-запись в память, а это промахи кэша, пейдж-фолты и прочие "ужасы". Впрочем, все это микрооптимизация, а не имея перед глазами полного кода функции, ничего утверждать наверняка нельзя.
1
|
12.08.2013, 02:02 | |
12.08.2013, 02:02 | |
Помогаю со студенческими работами здесь
17
Какую запись переменных в цикле for лучше использовать? Можно ли в цикле for объявить две переменных разного типа? Создание переменных в цикле Создание переменных новых переменных в процессе работы программы Объявление переменных в цикле for Присваивание переменных в цикле Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |