跳至内容

ArrayResize

ArrayResize

此函数用于设置数组的第一个维度的新大小。

int  ArrayResize(
   void&  array[],              // array passed by reference
   int    new_size,             // new array size
   int    reserve_size=0        // reserve size value (excess)
   );

参数

array[]

[输出] 用于调整大小的数组。

new_size

[输入] 第一个维度的新大小。

reserve_size=0

[输入] 可选参数。用于预留空间的大小。

返回值

如果执行成功,则返回调整大小后数组中所有元素的个数;否则返回 -1,并且数组不会调整大小。

注意

此函数仅适用于动态数组。需要注意的是,使用SetIndexBuffer()函数将动态数组作为指示缓冲区分配时,无法更改其大小。对于指示缓冲区,所有调整大小的操作都由终端的运行时子系统执行。

数组中元素的总数量不得超过 2147483647。

由于频繁的内存分配,建议使用第三个参数来设置预留空间,以减少物理内存的分配次数。所有后续的ArrayResize调用都不会导致物理内存的重新分配,而只是改变保留内存内第一个数组维度的大小。需要注意的是,第三个参数仅在物理内存分配期间使用。例如:

ArrayResize(arr,1000,1000);
for(int i=1;i<3000;i++)
   ArrayResize(arr,i,1000);

在这种情况下,内存将重新分配两次:第一次是在进入包含 2000 个元素的循环之前(数组大小将被设置为 1000),第二次是在 i 等于 2000 时。如果跳过第三个参数,将会发生 2000 次物理内存的重新分配,这将减慢程序的运行速度。

示例:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Counters
   ulong start=GetTickCount();
   ulong now;
   int   count=0;
//--- An array for demonstration of a quick version
   double arr[];
   ArrayResize(arr,100000,100000);
//--- Check how fast the variant with memory reservation works
   Print("--- Test Fast: ArrayResize(arr,100000,100000)");
   for(int i=1;i<=300000;i++)
     {
      //--- Set a new array size specifying the reserve of 100,000 elements!
      ArrayResize(arr,i,100000);
      //--- When reaching a round number, show the array size and the time spent
      if(ArraySize(arr)%100000==0)
        {
         now=GetTickCount();
         count++;
         PrintFormat("%d. ArraySize(arr)=%d Time=%d ms",count,ArraySize(arr),(now-start));
         start=now;
        }
     }
//--- Now show, how slow the version without memory reservation is
   double slow[];
   ArrayResize(slow,100000,100000);
//---
   count=0;
   start=GetTickCount();
   Print("---- Test Slow: ArrayResize(slow,100000)");
//---
   for(int i=1;i<=300000;i++)
     {
      //--- Set a new array size, but without the additional reserve
      ArrayResize(slow,i);
      //--- When reaching a round number, show the array size and the time spent
      if(ArraySize(slow)%100000==0)
        {
         now=GetTickCount();
         count++;
         PrintFormat("%d. ArraySize(slow)=%d Time=%d ms",count,ArraySize(slow),(now-start));
         start=now;
        }
     }
  }
//--- A sample result of the script
/*
   Test_ArrayResize (EURUSD,H1)   --- Test Fast: ArrayResize(arr,100000,100000)
   Test_ArrayResize (EURUSD,H1)   1. ArraySize(arr)=100000 Time=0 ms
   Test_ArrayResize (EURUSD,H1)   2. ArraySize(arr)=200000 Time=0 ms
   Test_ArrayResize (EURUSD,H1)   3. ArraySize(arr)=300000 Time=0 ms
   Test_ArrayResize (EURUSD,H1)   ---- Test Slow: ArrayResize(slow,100000)
   Test_ArrayResize (EURUSD,H1)   1. ArraySize(slow)=100000 Time=0 ms
   Test_ArrayResize (EURUSD,H1)   2. ArraySize(slow)=200000 Time=0 ms
   Test_ArrayResize (EURUSD,H1)   3. ArraySize(slow)=300000 Time=228511 ms
*/

另请参阅

ArrayInitialize

最后更新于