将本地OpenCV Mat变量声明为静态以防止重新分配 C++中OpenCV项目中的几个函数,我正在使用本地Mat(和UMat)变量作为内部计算的临时缓冲区。p>

将本地OpenCV Mat变量声明为静态以防止重新分配 C++中OpenCV项目中的几个函数,我正在使用本地Mat(和UMat)变量作为内部计算的临时缓冲区。p>,c++,opencv,memory-management,static,C++,Opencv,Memory Management,Static,我想阻止这些函数在每次调用它们时为它们的所有局部Mat变量分配内存。 这样做的目的不是使用更少的内存,而是确保内存可用或在第一次调用时失败,并防止由于内存分配而产生任何可能的开销 为了防止重新分配,我考虑将局部Mat变量声明为静态变量,并确保它们在函数中始终存储相同的数据大小和类型,尽管我不关心在多个调用中携带它们存储的数据 这种方法有意义吗?我这样做是错误的,还是有更好/更安全的方法?根据个人经验,在重复迭代中重用临时cv::Mat对象是一种有用且明智的方法 一个显著的好处是避免了相对较大的阵

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

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


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

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

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

但是,我不会使用静态变量,因为这通常会降低代码的可重用性(特别是当您希望利用并行化时)。将提供一些关于为什么会出现这种情况的补充解释


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

OpenCV有一个内置的机制来避免这种情况,因此您应该避免尝试执行的操作,因为除了制作“意大利面”之外,您不会从中获得任何好处代码。这绝对没有任何意义。是什么让你认为内存重新分配会在你的代码中引起任何问题?@ricardo有没有我可以读取的内置内存分配机制的参考?@ptaq我的代码运行在一个系统上,该系统的资源也被其他代码使用。我想确保我可以保留项目所需的所有大容量内存,或者在启动时失败。我不会使用静态变量,而是将有问题的代码封装在类中并使用成员变量。(如果需要的话,您可以在多个线程中使用代码,而不是使用静态变量)一个非常明显的好处是性能,因为重复分配大型数组确实会带来开销。在32位平台上,它将有助于减少地址空间碎片看起来是的,有道理,我已经在几个系统中使用了类似的技术,这些系统已经在生产中全天候运行多年了。@Gianni-See。您将无法在多个线程中安全地使用该类(特别是该函数)。