локальные и глобальные переменные

Тема в разделе "WASM.BEGINNERS", создана пользователем zxcc, 13 мар 2008.

  1. zxcc

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    Здравствуйте.Подскажите пожалуйста разницу между глобальными и локалными переменными.Какие когда лучше использовать?
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    глобальные хранятся в секции данных и доступны всем функциям. Локальные хранятся в стеке и доступны только функции, в которой они объявлены.

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

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Локальные и глолбальный переменные с точки зрения языка различаются только областью видимости, остальное не так важно.
    Локальные переменные могут хранится и в стеке, и в регистрах, и в секции данных...
     
  4. zxcc

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    особого вреда не будет если пользоваться практически только лок.перем.?
     
  5. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    zxcc
    Чем меньше глобальных переменных используется в ф-ии - тем лучше.
     
  6. zxcc

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    почему?
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Легче перенести такую функцию в другой проект.
     
  8. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    И вообще легче локализовать функцию в проекте.
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Плюс быстродействие и занимаемая память.
    Локальные переменные размещаются в стеке. При входе в функцию под ее локальные переменные выделяются адреса простым перемещением указателя стека sub esp,Х, а при выходе освобождаются add esp,X. Соответственно при следующем вызове этой же или другой функции ее локальные переменные будут выделены по тем же (или близким) адресам, т.е. получается многократное использование одних и тех же адресов под разные переменные. Поскольку в стеке также размещаются параметры функций, адреса возврата и сохраненные копии регистров (push\pop), то происходит частое обращение к одному и тому же диапазону адресов стека, поэтому все данные по этим адресам как правило сидят в кэше процессора и редко сбрасываются (или вообще не сбрасываются) в медленное ОЗУ.
    Ну а чем больше глобальных переменных, тем больше "драгоценного" кэша они поедают. Поэтому чем их меньше, тем лучше (в пределах разумного конечно ;)
     
  10. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    ещё и читабельность кода повышается, сразу понятно что и куда передаётся.
     
  11. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Да если еще держать всё переменные в стеке и просмотреть гараницы памяти отводимые под эти переменные, можно завалить стек и вызвать его переполнение. Вот тут и "зверки" могут поживиться.
     
  12. zxcc

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    Большое всем спасибо.Подскажите ещё как обьявить лок.перем. типа perem db 20 DUP (0)
     
  13. Zhelezovsky

    Zhelezovsky Member

    Публикаций:
    0
    Регистрация:
    24 окт 2006
    Сообщения:
    39
    Код (Text):
    1. WindowProc proc   hWin :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD
    2. LOCAL      hdc    :DWORD                ;<--Локальные
    3. LOCAL      ps     :PAINTSTRUCT              ;<--переменные
     
  14. zxcc

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    А глюки проги из за переменных бывают?
     
  15. zxcc

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    Подскажите пожалуйста.Такая проблема.Есть лок.переменная(LOCAL Y:lol: WORD)
    до проверки условия (.if Y==0)ни где не используется.Условие не выполняется из-за
    того что в перем. при загрузке программы уже есть какие то значения,просмотрел при помощи(invoke MessageBox,hWnd,ADDR Y,0,0).Откуда они там берутся?
     
  16. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Вспомнился боян:
    "Вопрос:
    Буратине дали 3 яблока. Два из них злобный дендромутант съел. Сколько осталось яблок у Буратины?
    Ответ:
    А *уй его знает!
    Мораль: инициализируйте переменные."

    zxcc
    Локальные переменные выделяются в стеке, а там обычно мусор. Так что инициализируй переменные при входе в процедуру.

    Гораздо проще это смотреть в отладчике:)
     
  17. zxcc

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    asd Спасибо.Просто прога работала нормально добавил опций и соответсвенно переменных
    и начались глюки.Извинюсь а как(Так что инициализируй переменные при входе в процедуру.)?
     
  18. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    mov Y,0h :)
     
  19. zxcc

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    asd Спасибо.
     
  20. zxcc

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    Извинюсь а
    .data
    Y dd 0
    так можно инициализировать?