将本地 OpenCV Mat 变量声明为静态以防止重新分配
declaring local OpenCV Mat variable as static for preventing reallocation
我正在研究的C++OpenCV项目中的几个函数使用局部Mat(和UMat(变量作为内部计算的临时缓冲区。
我想防止这些函数在每次调用它们时为其所有局部 Mat 变量分配内存。 这样做的目的不是使用更少的内存,而是确保内存可用或在第一次调用时失败,并防止由于内存分配而导致的任何可能的开销。
为了防止重新分配,我考虑将局部 Mat 变量声明为静态,并确保它们始终在函数中存储相同的数据大小和类型,尽管我不关心在多个调用中携带它们存储的数据。
这种方法有意义吗?我的做法是错误的,还是有更好/更安全的方法?
根据个人经验,在重复迭代中重用临时cv::Mat
对象的方法是一种有用且明智的方法。
一个显著的好处是避免了相对较大的阵列的不断重新分配,这往往会带来明显的开销。此外,至少在 32 位平台上,它有助于限制地址空间碎片(当您的程序长时间运行时,这会变得很明显(。
但是,我不会使用静态变量,因为这通常会降低代码的可重用性(尤其是当您想要利用并行化时(。本问答将提供一些额外的解释,说明为什么会这样。
您可以提供对持久上下文的引用作为参数,或者实现类似函子的东西,或者只是在您的类中使用成员变量......
相关文章:
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 为模板参数类型中的新对象分配内存
- 新运算符分配的大小大于声明的大小.为什么
- 在C++中分配分配
- 为什么支撑初始化分配分配填充垃圾变量
- C 新操作员分配新内存
- 新不分配内存?
- 如果我的C++“新”内存分配失败,如何找出返回值
- 我可以用新的分配内存块吗?
- COM / DCOM:服务器存根不会为现有接口中的新方法分配内存
- 在线程在 C++ 中完成后将新任务分配给线程
- 只能使用CUDA中的新运算符分配有限的内存
- 与将新内容分配给向量的指针斗争
- 确定C++中新运算符分配的内存大小
- 按新内存分配
- 是否有必要使用 'new' 将新指针分配给与指向同一结构的先前存在的指针相同的结构?如果是这样,为什么?
- 用于新运算符分配的公共内存
- boost::io_service post方法是否引起新的分配?
- 如何在C++中检索由新运算符分配的对象的地址