
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Освобождение памяти MQL5 программы не возвращает ее в операционную систему, а оставляет в своих пулах памяти для последующего использования.
Скорость любой сложной программы напрямую зависит от умения управлять памятью, особенно на массовых перевыделениях.
Поэтому в MQL5 используются свои специфические пулы памяти под разные задачи и типы данных. Их цель - обеспечить максимальную скорость выделений/удалений/перевыделений и быть отделенными от основной памяти терминала, чтобы обеспечить песочницу.
Не надо думать, что TerminalInfoInteger(TERMINAL_MEMORY_USED) или TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE) обязаны показывать "правильные" с вашей точки зрения данные.
Про пулы я понимаю, мета держит память пока ее в достатке для того, что бы предотвратить повторную аллокацию, однако, в таком случае, можно было бы и оставить возможность ручного менеджмента памяти. В моем случае, массив не переаллоцируется и очевидно, что выделеная память более не нужна. А как будет работать "сборщик мусора" когда памяти будет не хватать, сколько ресурсов будет тратить на это и есть ли там такой вообще - вопрос не тривиальный. В данном случае, ArrayFree сразу возвращает память обратно в кучу.
Так это не костыль, это фича от разрабов. Если передать reserve -1 то разница между реальной и используемой памятью схлопывается. это же ответ на вопрос почто точь-в-точь совпадающий с вашим.
Спасибо, голова кипела - про reserve -1 в том посте между двух кусков кода не сразу заметил.
Про пулы я понимаю, мета держит память пока ее в достатке для того, что бы предотвратить повторную аллокацию, однако, в таком случае, можно было бы и оставить возможность ручного менеджмента памяти. В моем случае, массив не переаллоцируется и очевидно, что выделеная память более не нужна. А как будет работать "сборщик мусора" когда памяти будет не хватать, сколько ресурсов будет тратить на это и есть ли там такой вообще - вопрос не тривиальный. В данном случае, ArrayFree сразу возвращает память обратно в кучу.
У нас нет сборщика мусора, память управляется вручную как в С++.
Но есть методы оптимизации использования памяти некоторых объектов, чтобы избежать переаллокаций.
У нас нет сборщика мусора, память управляется вручную как в С++.
Надо почитать, неужто оверлей?
ArrayFree?
надо уменьшить размер а не обнулить, так-то да
Вадим, имхо, тут подойдёт что-то похожее на кольцевой буфер. Посмотрите у коллеги Груздева тут.
Только придётся там класс модифицировать. Вместо
double m_data[];
вставить к примеру
MqlTick m_ticks[];
Ну и т.д. Один раз задали размер буфера и всё - работаем без проблем и усилий.