将本地 OpenCV Mat 变量声明为静态以防止重新分配

declaring local OpenCV Mat variable as static for preventing reallocation

本文关键字:新分配 分配 静态 OpenCV Mat 变量 声明      更新时间:2023-10-16

我正在研究的C++OpenCV项目中的几个函数使用局部Mat(和UMat(变量作为内部计算的临时缓冲区。

我想防止这些函数在每次调用它们时为其所有局部 Mat 变量分配内存。 这样做的目的不是使用更少的内存,而是确保内存可用或在第一次调用时失败,并防止由于内存分配而导致的任何可能的开销。

为了防止重新分配,我考虑将局部 Mat 变量声明为静态,并确保它们始终在函数中存储相同的数据大小和类型,尽管我不关心在多个调用中携带它们存储的数据。

这种方法有意义吗?我的做法是错误的,还是有更好/更安全的方法?

根据个人经验,在重复迭代中重用临时cv::Mat对象的方法是一种有用且明智的方法。

一个显著的好处是避免了相对较大的阵列的不断重新分配,这往往会带来明显的开销。此外,至少在 32 位平台上,它有助于限制地址空间碎片(当您的程序长时间运行时,这会变得很明显(。

但是,我不会使用静态变量,因为这通常会降低代码的可重用性(尤其是当您想要利用并行化时(。本问答将提供一些额外的解释,说明为什么会这样。

您可以提供对持久上下文的引用作为参数,或者实现类似函子的东西,或者只是在您的类中使用成员变量......