объявление локальной переменной OpenCV Mat статической для предотвращения перераспределения - PullRequest
0 голосов
/ 31 августа 2018

Несколько функций в проекте C ++ OpenCV, над которым я работаю, используют локальные переменные Mat (и UMat) в качестве временных буферов для внутренних вычислений.

Я бы хотел запретить этим функциям выделять память для всех своих локальных переменных Mat каждый раз, когда они вызываются. Цель этого состоит не в том, чтобы использовать меньше памяти, а в том, чтобы убедиться, что память доступна или перестала работать при первом вызове, и предотвратить возможные издержки из-за выделения памяти.

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

Имеет ли этот подход смысл? Я делаю это неправильно или есть лучший / безопасный?

1 Ответ

0 голосов
/ 05 сентября 2018

Из личного опыта, подход повторного использования временных cv::Mat объектов в повторяющихся итерациях является полезным и разумным подходом.

Одним значительным преимуществом является избежание постоянного перераспределения относительно больших массивов, что имеет тенденцию нести заметные накладные расходы. Кроме того, по крайней мере на 32-битных платформах это помогает ограничить фрагментацию адресного пространства (что становится заметно, когда ваша программа работает долго).

Однако я бы не стал использовать статические переменные, поскольку это, как правило, снижает возможность повторного использования вашего кода (особенно, если вы хотите использовать преимущества распараллеливания). В этом вопросе будет дано дополнительное объяснение, почему это так.

Вы можете либо предоставить ссылку (ы) на постоянный контекст в качестве параметра, либо реализовать что-то вроде функтора, либо просто использовать переменные-члены в своем классе ...

...