局部变量
在函数内可变量的声明是局部的。局部变量在声明的部分里是被限定的。局部变量可以由任意一个表达式结果初始化。 每次函数的运行只可以初始化一个局部变量。局部变量储存在相应的存储器上。
示例:
int somefunc()
|
变量范围是涉及变量的模块部分。模块中声明的变量(内部),有模块规定其范围。变量声明启动模块范围,以终止程序结束。
开始函数声明的局部变量也有模块范围,和局部变量函数参数。任何模块都可以包括变量声明。如果嵌入模块内外模块有同名标识符,隐藏外部指标,直到内部操作完成。
示例:
void OnStart()
|
这意味着内部模块运行时,只看到自己的局部指标值,看不到外部同名指标值。
示例:
void OnStart()
|
即使从启动模块就存在,公开静态局部变量仍有模块范围。
存储栈 #
在每个MQL5程序中,称为存储栈的特殊内存区被分配存储自动创建的局部函数变量。一个存储栈可以分配给全部函数,指标的默认大小等于1Mb。在EA交易和脚本中,存储栈大小都可以使用#property stacksize编译指令(以字节设定存储栈大小)来管理, 默认情况下,为存储栈分配8Mb内存。
静态局部变量存储在与其他静态和全局变量存储的相同的地方 - 特殊的内存区域 ,它是独立于存储栈的存在。动态创建的变量也使用独立于存储栈的内存区域。
随着每个函数的调用,存储栈上的区域分配给内部非静态变量。退出函数后,内存可再次提供使用。
如果从第一个函数调用第二个,然后第二个函数从剩下的栈内存占据变量所需的大小。因此,当使用包含函数时,每个函数将会连续占据栈内存。这可能会导致一个函数调用期间的内存不足,这种情况被称为存储栈溢出。
因此,对于大型本地数据,您应该更好地利用动态内存 - 当进入一个函数时,分配本地所需的内存,在系统(new, ArrayResize()),和退出函数时,释放内存(delete,ArrayFree())。
另见
数据类型, 类型密封和扩展,变量初始化, 可见范围和变量使用期, 创建和删除对象