在编程过程中,我们常常需要改变数组的大小,特别是动态数组。在MQL4中,我们可以通过使用ArrayResize函数来达到这一目的。本文将深入探讨ArrayResize函数的应用和其高效实践。
- 函数概述
ArrayResize函数用于设置数组第一维度的新大小。
int ArrayResize(
void& array[], // 传递引用的数组
int new_size, // 新的数组大小
int reserve_size=0 // 预留大小值(额外的)
);
参数说明:
- array[]:需要改变大小的数组。
- new_size:第一维度的新大小。
- reserve_size=0:可选参数。分配大小以获得预留空间。
返回值:
如果执行成功,返回调整大小后数组中所有元素的数量,否则返回-1,数组大小不变。
注意事项:
- 此函数仅适用于动态数组。
- 无法改变通过SetIndexBuffer()函数分配为指标缓冲的动态数组的大小。
- 数组中元素的总数不能超过2147483647。
- 在频繁的内存分配中,建议使用第三个参数来减少物理内存分配的次数。
- 实际应用示例
下面通过一个实际例子,来看看ArrayResize函数的高效应用。
void OnStart()
{
//--- 计时器
ulong start=GetTickCount();
ulong now;
int count=0;
//--- 示范快速版本的数组
double fastArray[];
ArrayResize(fastArray,100000,100000);
//--- 检测有内存预留的版本的执行速度
Print("--- 测试快速版本: ArrayResize(fastArray,100000,100000)");
for(int i=1;i<=300000;i++)
{
//--- 设置新的数组大小,并指定100,000元素的预留!
ArrayResize(fastArray,i,100000);
//--- 当达到一个整数时,显示数组大小和花费的时间
if(ArraySize(fastArray)%100000==0)
{
now=GetTickCount();
count++;
PrintFormat("%d. ArraySize(fastArray)=%d Time=%d ms",count,ArraySize(fastArray),(now-start));
start=now;
}
}
//--- 示范慢速版本的数组
double slowArray[];
ArrayResize(slowArray,100000,100000);
count=0;
start=GetTickCount();
Print("---- 测试慢速版本: ArrayResize(slowArray,100000)");
for(int i=1;i<=300000;i++)
{
//--- 设置新的数组大小,但不使用额外的预留
ArrayResize(slowArray,i);
//--- 当达到一个整数时,显示数组大小和花费的时间
if(ArraySize(slowArray)%100000==0)
{
now=GetTickCount();
count++;
PrintFormat("%d. ArraySize(slowArray)=%d Time=%d ms",count,ArraySize(slowArray),(now-start));
start=now;
}
}
}
在这个示例中,我们比较了有内存预留和无内存预留的ArrayResize函数执行效率。结果表明,采用内存预留的版本在调整数组大小时更为高效。
- 总结
ArrayResize函数是一个强大的工具,可以帮助我们灵活地调整动态数组的大小。通过合理地使用预留大小,我们可以显著提高程序的运行效率,优化内存使用。