Освобождение памяти ArrayResize и ArrayRemove. - страница 2

 
Renat Fatkhullin #:

Освобождение памяти MQL5 программы не возвращает ее в операционную систему, а оставляет в своих пулах памяти для последующего использования.


Скорость любой сложной программы напрямую зависит от умения управлять памятью, особенно на массовых перевыделениях.

Поэтому в MQL5 используются свои специфические пулы памяти под разные задачи и типы данных. Их цель - обеспечить максимальную скорость выделений/удалений/перевыделений и быть отделенными от основной памяти терминала, чтобы обеспечить песочницу.

Не надо думать, что TerminalInfoInteger(TERMINAL_MEMORY_USED) или TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE) обязаны показывать "правильные" с вашей точки зрения данные.

Про пулы я понимаю, мета держит память пока ее в достатке для того, что бы предотвратить повторную аллокацию, однако, в таком случае, можно было бы и оставить возможность ручного менеджмента памяти. В моем случае, массив не переаллоцируется и очевидно, что выделеная память более не нужна. А как будет работать "сборщик мусора" когда памяти будет не хватать, сколько ресурсов будет тратить на это и есть ли там такой вообще - вопрос не тривиальный. В данном случае, ArrayFree сразу возвращает память обратно в кучу. 

 
Andrei Trukhanovich #:

Так это не костыль, это фича от разрабов. Если передать reserve -1 то разница между реальной и используемой памятью схлопывается. это же ответ на вопрос почто точь-в-точь совпадающий с вашим.

Спасибо, голова кипела - про reserve -1 в том посте между двух кусков кода не сразу заметил.

 
Вадим Калашнков #:

Про пулы я понимаю, мета держит память пока ее в достатке для того, что бы предотвратить повторную аллокацию, однако, в таком случае, можно было бы и оставить возможность ручного менеджмента памяти. В моем случае, массив не переаллоцируется и очевидно, что выделеная память более не нужна. А как будет работать "сборщик мусора" когда памяти будет не хватать, сколько ресурсов будет тратить на это и есть ли там такой вообще - вопрос не тривиальный. В данном случае, ArrayFree сразу возвращает память обратно в кучу. 

У нас нет сборщика мусора, память управляется вручную как в С++.

Но есть методы оптимизации использования памяти некоторых объектов, чтобы избежать переаллокаций.

 
Renat Fatkhullin #:

У нас нет сборщика мусора, память управляется вручную как в С++.

Надо почитать, неужто оверлей? 

 
 
fxsaber #:
ArrayFree?

надо уменьшить размер а не обнулить, так-то да

 
Изящненьское извращеньице
 

Вадим, имхо, тут подойдёт что-то похожее на кольцевой буфер. Посмотрите у коллеги Груздева тут.

Только придётся там класс модифицировать. Вместо 

double m_data[];

вставить к примеру

MqlTick m_ticks[];

Ну и т.д. Один раз задали размер буфера и всё - работаем без проблем и усилий.


Класс для создания кольцевого буфера
Класс для создания кольцевого буфера
  • www.mql5.com
Класс позволяет самостоятельно организовывать внутри советника или индикатора минитаймсерии, индикаторные минибуфера, короткие буфера для хранения промежуточных потоковых данных.
Причина обращения: