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
*/另请参阅
最后更新于