我正在研究的C ++ OpenCV项目中的几个函数使用本地Mat(和UMat)变量作为内部计算的临时缓冲区。
我想阻止这些函数在每次调用时为其所有本地Mat变量分配内存。这样做的目的不是为了减少内存,而是为了确保内存在第一次调用时可用或失败,并防止因内存分配而导致任何可能的开销。
为了防止重新分配,我考虑将本地Mat变量声明为静态并确保它们将始终在函数中存储相同的数据大小和类型,尽管我不关心它们存储多个调用中存储的数据。
这种方法有意义吗?我这样做是错误的,还是有更好/更安全的?
根据个人经验,在重复迭代中重复使用临时cv::Mat
对象的方法是一种有用且明智的方法。
一个重要的好处是避免不断重新分配相对较大的阵列,这往往会带来明显的开销。此外,至少在32位平台上,它有助于限制地址空间碎片(当程序运行很长时间时会变得明显)。
但是,我不会使用静态变量,因为这通常会降低代码的可重用性(特别是当您想要利用并行化时)。 This Q/A将提供一些额外的解释为什么会这样。
您可以将持久化上下文的引用作为参数提供,或者可以实现类似函数的操作,或者只是在类中使用成员变量...