Здравствуйте.Подскажите пожалуйста разницу между глобальными и локалными переменными.Какие когда лучше использовать?
глобальные хранятся в секции данных и доступны всем функциям. Локальные хранятся в стеке и доступны только функции, в которой они объявлены. если переменная используется только в одной функции и ее значение не должно сохраняться между вызовами этой функции, она должна быть локальной. Иначе - глобальной.
Локальные и глолбальный переменные с точки зрения языка различаются только областью видимости, остальное не так важно. Локальные переменные могут хранится и в стеке, и в регистрах, и в секции данных...
Плюс быстродействие и занимаемая память. Локальные переменные размещаются в стеке. При входе в функцию под ее локальные переменные выделяются адреса простым перемещением указателя стека sub esp,Х, а при выходе освобождаются add esp,X. Соответственно при следующем вызове этой же или другой функции ее локальные переменные будут выделены по тем же (или близким) адресам, т.е. получается многократное использование одних и тех же адресов под разные переменные. Поскольку в стеке также размещаются параметры функций, адреса возврата и сохраненные копии регистров (push\pop), то происходит частое обращение к одному и тому же диапазону адресов стека, поэтому все данные по этим адресам как правило сидят в кэше процессора и редко сбрасываются (или вообще не сбрасываются) в медленное ОЗУ. Ну а чем больше глобальных переменных, тем больше "драгоценного" кэша они поедают. Поэтому чем их меньше, тем лучше (в пределах разумного конечно
Да если еще держать всё переменные в стеке и просмотреть гараницы памяти отводимые под эти переменные, можно завалить стек и вызвать его переполнение. Вот тут и "зверки" могут поживиться.
Code (Text): WindowProc proc hWin :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD LOCAL hdc :DWORD ;<--Локальные LOCAL ps :PAINTSTRUCT ;<--переменные
Подскажите пожалуйста.Такая проблема.Есть лок.переменная(LOCAL YWORD) до проверки условия (.if Y==0)ни где не используется.Условие не выполняется из-за того что в перем. при загрузке программы уже есть какие то значения,просмотрел при помощи(invoke MessageBox,hWnd,ADDR Y,0,0).Откуда они там берутся?
Вспомнился боян: "Вопрос: Буратине дали 3 яблока. Два из них злобный дендромутант съел. Сколько осталось яблок у Буратины? Ответ: А *уй его знает! Мораль: инициализируйте переменные." zxcc Локальные переменные выделяются в стеке, а там обычно мусор. Так что инициализируй переменные при входе в процедуру. Гораздо проще это смотреть в отладчике
asd Спасибо.Просто прога работала нормально добавил опций и соответсвенно переменных и начались глюки.Извинюсь а как(Так что инициализируй переменные при входе в процедуру.)?