slbmeh Posted March 27, 2012 Share Posted March 27, 2012 (edited) Beyond the definition of scope, a global variable remains in your memory space until it is explicitly released. The memory space consumed by local variables is released by the garbage collector when it cycles after your function has executed. That is the main purpose of separate declarations. Having a lot of Global declarations will impact your memory consumption. A variable is essentially a pointer to a memory address, the amount of memory it takes to store the address space of a variable is determined by the size of the address and your descriptor table. If you were to explicitly flag each variable for a scope resolution it would take even more memory. Lets consider how the GC handles variables for each scope, Local variables are flagged for garbage collection once the function has completed execution, and Global variables are held until they are explicitly released or the application has terminated. In compiler theory you have lexers, parsers, interpreters, and compilers. The lexer defines specific tokens within the language such as Func, Local, Dim, Global, etc... The parser then takes the tokens generated by the lexer to pass it on to the interpreter or compiler. If the purpose of a Local variable is to be released upon execution of the function, Local variables cannot sensibly exist in the Global scope (outside of a function) because it cannot determine when it can safely be released. The parser is then smart enough to pick up on the fact that a Local or Dim token is outside of Func and EndFunc tokens and converts it to Global to eliminate overhead on the GC and memory tables. This is all educated speculation of course. Edited March 27, 2012 by slbmeh Link to comment Share on other sites More sharing options...
Reg2Post Posted March 27, 2012 Share Posted March 27, 2012 I don't see the point of declaring a variable as "Local" unless you have MustDeclareVars set to 1. Just leave it out when assigning a variable and it already is a local variable (with exception to the main script body) and then use Global when needed. Even if passing a local variable (inside a function) to another function as a parameter I don't think you have to decare it as a local variable. Link to comment Share on other sites More sharing options...
guinness Posted March 27, 2012 Share Posted March 27, 2012 I don't see the point of declaring a variable as "Local" unless you have MustDeclareVars set to 1. Just leave it out when assigning a variable and it already is a local variable (with exception to the main script body) and then use Global when needed. Even if passing a local variable (inside a function) to another function as a parameter I don't think you have to decare it as a local variable.Let's hope others don't adopt your approach. UDF List: _AdapterConnections() • _AlwaysRun() • _AppMon() • _AppMonEx() • _ArrayFilter/_ArrayReduce • _BinaryBin() • _CheckMsgBox() • _CmdLineRaw() • _ContextMenu() • _ConvertLHWebColor()/_ConvertSHWebColor() • _DesktopDimensions() • _DisplayPassword() • _DotNet_Load()/_DotNet_Unload() • _Fibonacci() • _FileCompare() • _FileCompareContents() • _FileNameByHandle() • _FilePrefix/SRE() • _FindInFile() • _GetBackgroundColor()/_SetBackgroundColor() • _GetConrolID() • _GetCtrlClass() • _GetDirectoryFormat() • _GetDriveMediaType() • _GetFilename()/_GetFilenameExt() • _GetHardwareID() • _GetIP() • _GetIP_Country() • _GetOSLanguage() • _GetSavedSource() • _GetStringSize() • _GetSystemPaths() • _GetURLImage() • _GIFImage() • _GoogleWeather() • _GUICtrlCreateGroup() • _GUICtrlListBox_CreateArray() • _GUICtrlListView_CreateArray() • _GUICtrlListView_SaveCSV() • _GUICtrlListView_SaveHTML() • _GUICtrlListView_SaveTxt() • _GUICtrlListView_SaveXML() • _GUICtrlMenu_Recent() • _GUICtrlMenu_SetItemImage() • _GUICtrlTreeView_CreateArray() • _GUIDisable() • _GUIImageList_SetIconFromHandle() • _GUIRegisterMsg() • _GUISetIcon() • _Icon_Clear()/_Icon_Set() • _IdleTime() • _InetGet() • _InetGetGUI() • _InetGetProgress() • _IPDetails() • _IsFileOlder() • _IsGUID() • _IsHex() • _IsPalindrome() • _IsRegKey() • _IsStringRegExp() • _IsSystemDrive() • _IsUPX() • _IsValidType() • _IsWebColor() • _Language() • _Log() • _MicrosoftInternetConnectivity() • _MSDNDataType() • _PathFull/GetRelative/Split() • _PathSplitEx() • _PrintFromArray() • _ProgressSetMarquee() • _ReDim() • _RockPaperScissors()/_RockPaperScissorsLizardSpock() • _ScrollingCredits • _SelfDelete() • _SelfRename() • _SelfUpdate() • _SendTo() • _ShellAll() • _ShellFile() • _ShellFolder() • _SingletonHWID() • _SingletonPID() • _Startup() • _StringCompact() • _StringIsValid() • _StringRegExpMetaCharacters() • _StringReplaceWholeWord() • _StringStripChars() • _Temperature() • _TrialPeriod() • _UKToUSDate()/_USToUKDate() • _WinAPI_Create_CTL_CODE() • _WinAPI_CreateGUID() • _WMIDateStringToDate()/_DateToWMIDateString() • Au3 script parsing • AutoIt Search • AutoIt3 Portable • AutoIt3WrapperToPragma • AutoItWinGetTitle()/AutoItWinSetTitle() • Coding • DirToHTML5 • FileInstallr • FileReadLastChars() • GeoIP database • GUI - Only Close Button • GUI Examples • GUICtrlDeleteImage() • GUICtrlGetBkColor() • GUICtrlGetStyle() • GUIEvents • GUIGetBkColor() • Int_Parse() & Int_TryParse() • IsISBN() • LockFile() • Mapping CtrlIDs • OOP in AutoIt • ParseHeadersToSciTE() • PasswordValid • PasteBin • Posts Per Day • PreExpand • Protect Globals • Queue() • Resource Update • ResourcesEx • SciTE Jump • Settings INI • SHELLHOOK • Shunting-Yard • Signature Creator • Stack() • Stopwatch() • StringAddLF()/StringStripLF() • StringEOLToCRLF() • VSCROLL • WM_COPYDATA • More Examples... Updated: 22/04/2018 Link to comment Share on other sites More sharing options...
BrewManNH Posted March 28, 2012 Share Posted March 28, 2012 I don't see the point of declaring a variable as "Local" unless you have MustDeclareVars set to 1. Just leave it out when assigning a variable and it already is a local variable (with exception to the main script body) and then use Global when needed. Even if passing a local variable (inside a function) to another function as a parameter I don't think you have to decare it as a local variable.Unless of course you're using it in a function that might be used somewhere other than the original script. Then you've just added a whole new level of debugging problems because you just reused a Global variable name in your new script, in your old function that you failed to declare as Local inside your function. If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator Link to comment Share on other sites More sharing options...
Reg2Post Posted March 28, 2012 Share Posted March 28, 2012 Unless of course you're using it in a function that might be used somewhere other than the original script. Then you've just added a whole new level of debugging problems because you just reused a Global variable name in your new script, in your old function that you failed to declare as Local inside your function.Now that is a good example of when to declare a variable as local. If a variable name is going to be reused in another script and the answer to the question below is no. The post I made above was in regards to a single stand alone script such as the OP's.So if I reuse a Global variable name in a separate script, the new script will not have a new memory allocation to reference if both scripts are running simultaneously? Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now