Вопрос по функции ArrayResize()

 

Читаю справку по функции ArrayResize().

Всё как-бы понятно. При изменении в меньшую сторону, массив пилиться с конца в сторону 0-го индекса. Но есть третий параметр. В справке написано, то мол:

При частом распределении памяти рекомендуется использовать третий параметр, задающий резерв для уменьшения количества физического распределения памяти. Все последующие вызовы функции ArrayResize не приводят к физическому перераспределению памяти, а только меняется размер первого измерения массива в пределах зарезервированной памяти. Следует помнить, что третий параметр будет использоваться только тогда, когда будет происходить физическое распределение памяти, например:

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

В данном случае произойдёт 2 перераспределения памяти, один раз до входа в цикл на 2000 элементов, при этом размерность массива будет установлена в 1000 и второй при i равной 2000. Если третий параметр опустить, то произойдёт 2000 физических перераспределения памяти и это замедлит выполнение программы.


Я читаю так:

1. Размер массива arr изменяется. Тперь он равен 1000 элементам + 1000 резервных. Получается, как-бы 1000 базово, но тероитически, если понадобится может быть увеличена до 2000 автоматически. я верно понимаю?

2. По сколько в цикле у нас итерации от 1 до 3000 почему не будет изменяться размер от 1 до 3000 включительно? Если бы вторым параметров в функцию ArraySize() пришло фиксированное число 3000 я бы понял. А так получается, что у нас цикл. Почему компилятор игнорирует пробег по всем итерациям?

Я понимаю, что arrayList удобнее и гибче, но на 5-ке у меня реализована именно динамически, и не только на 5-ке.. А на 4-ке вариантов нет. Здесь приходится работать с массивами. Поэтому и возник этот вопрос. Т.к. производительность важна.

ArrayResize - Операции с массивами - Справочник MQL4
ArrayResize - Операции с массивами - Справочник MQL4
  • docs.mql4.com
При успешном выполнении функция возвращает количество всех элементов, содержащихся в массиве после изменения размера; в противном случае возвращает -1 и массив не меняет размеры. Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в...
 
Viktar Dzemikhau:

Читаю справку по функции ArrayResize().

Всё как-бы понятно. При изменении в меньшую сторону, массив пилиться с конца в сторону 0-го индекса. Но есть третий параметр. В справке написано, то мол:

Я читаю так:

1. Размер массива arr изменяется. Тперь он равен 1000 элементам + 1000 резервных. Получается, как-бы 1000 базово, но тероитически, если понадобится может быть увеличена до 2000 автоматически. я верно понимаю?

2. По сколько в цикле у нас итерации от 1 до 3000 почему не будет изменяться размер от 1 до 3000 включительно? Если бы вторым параметров в функцию ArraySize() пришло фиксированное число 3000 я бы понял. А так получается, что у нас цикл. Почему компилятор игнорирует пробег по всем итерациям?

Я понимаю, что arrayList удобнее и гибче, но на 5-ке у меня реализована именно динамически, и не только на 5-ке.. А на 4-ке вариантов нет. Здесь приходится работать с массивами. Поэтому и возник этот вопрос. Т.к. производительность важна.

сложно все у Вас, я понимаю что в справке так написано:

1. обьявили динамический массив и первый раз определяем размер массива с помощью ArrayResize(), причем задаем 3-й параметр с учетом максимально возможного в нашем алгоритме размера массива, т.е. ArrayResize(arr,1,3000);

2. При последующих изменениях размера массива задаем только 2 параметра, т.е. 

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

вот в таком виде разработчики пишут в справке будет более быстро выполнено изменение размера массива, чем:

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

кактотак

 

Это понятно. Но в справке такого нет:

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

Там же написано только вот так:

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

А вообще, я понял, что если задать резервный размер будет работать быстрее, но почему в том случает только 2 раза будет ресайз не особо понятно. Ведь цикл по 3000 элементов, например, в цикле, который я привёл должен выполнить 3000 итераций. А получается, что как-будто изначально смотрится то, что в 3-ем параметре 1000 и поэтому до 1000-ой итерации пропускается. Хотя как дальше там реализовано хз. Если бы увидел я реализацию, не было бы вопросов, а так можно лишь догадываться.

 

Давайте объясню на бутылках.

Собралась компания, заказали ящик пива (первый параметр) и ящик про-запас (второй параметр). Сидим - пиво пьем. Как кончится бутылка - ее в пустой ящик и на стол новую ставим. На столе все время 20 бутылок. Но вот выпили 21-ю бутылку, на столе осталось 19, а запас иссяк. Тут снова вступает в действие второй параметр - бежим в магазин за новым ящиком пива. Мораль такова: пока в запасе что-то есть - пьем пиво. Кончился запас - вспоминай про второй параметр и беги в магазин.

Причина обращения: