c++笔记—— AutoBuffer类(opencv)

自动分配缓冲区类

Automatically Allocated Buffer Class.

这个类用于函数和方法中的临时缓冲区。如果临时缓冲区通常很小(几K的内存),但其大小取决于参数,则在堆栈上创建一个小的固定大小数组,并在足够大时使用它是有意义的。如果所需缓冲区的大小大于固定大小,则动态分配另一个足够大的缓冲区,并在处理后释放它。因此,在典型情况下,当缓冲区大小很小时,与malloc()/ free()相关的开销是没有的。同时,对处理的数据大小没有限制。

c++ 复制代码
void my_func(const cv::Mat& m)
{
   cv::AutoBuffer<float> buf(1000); // create automatic buffer containing 1000 floats
   buf.allocate(m.rows); // if m.rows <= 1000, the pre-allocated buffer is used,
                         // otherwise the buffer of "m.rows" floats will be allocated
                         // dynamically and deallocated in cv::AutoBuffer destructor
   ...
}

当使用的临时内存小于预分配的内存大小时,无需动态malloc/free,可以直接从内存池中取用,提高了性能

变量名buf表示缓冲区的头指针

内存池技术

内存池技术是一种用于管理内存分配和释放的方法,它旨在提高程序的性能和效率,特别是在需要频繁分配和释放小块内存时。内存池技术的基本思想是预先分配一定数量的内存块,并在程序运行期间重复使用这些内存块,而不是每次需要内存时都去向操作系统请求分配新的内存空间。

以下是内存池技术的一些关键概念和优势:

  • 预先分配内存

    内存池在程序启动时预先分配一定数量的内存块,并将它们保存在一个池中。这样做可以避免在程序运行时频繁地向操作系统请求内存分配,从而提高性能和效率。

  • 重复使用内存块

    内存池会跟踪哪些内存块是空闲的,并且在需要分配内存时从空闲内存块中选择一个来使用。一旦某个内存块不再需要,它将被标记为空闲状态,以便后续的内存分配可以重复使用它。

  • 减少内存碎片

    使用内存池可以减少内存碎片的产生,因为所有分配的内存块都是固定大小的,并且在池中被连续地存放。这有助于降低内存分配和释放的开销,并提高内存使用效率。

  • 提高性能

    由于减少了内存分配和释放的次数,并且减少了内存碎片的产生,因此内存池技术可以显著提高程序的性能和响应速度,特别是在多线程环境和资源有限的嵌入式系统中。

  • 定制化管理

    内存池可以根据应用程序的需求进行定制化管理,例如可以创建多个不同大小的内存池,或者使用特定的分配策略和算法来优化内存分配和释放的性能。

总之,内存池技术是一种有效的内存管理方法,可以提高程序的性能和效率,减少内存分配和释放的开销,同时降低内存碎片的产生。因此,在需要频繁进行内存分配和释放的场景中,内存池技术通常是一个值得考虑的选择。

参考链接1-opencv
参考链接2-知乎

相关推荐
王老师青少年编程8 小时前
csp信奥赛C++高频考点专项训练之字符串 --【子串查找】:[NOIP 2009 提高组] 潜伏者
c++·字符串·csp·高频考点·信奥赛·子串查找·潜伏者
初願致夕霞8 小时前
基于系统调用的Linux网络编程——UDP与TCP
linux·网络·c++·tcp/ip·udp
问心无愧05139 小时前
ctf show web入门37
笔记
小小de风呀10 小时前
de风——【从零开始学C++】(五):内存管理
开发语言·c++
羊群智妍10 小时前
2026生成式AI搜索优化:GEO监测工具全解析
笔记
koo36411 小时前
周报5.10
笔记
CHANG_THE_WORLD11 小时前
C语言中的 %*s 和 %.*s 和C++的字符串格式化输出
c语言·c++·c#
kdxiaojie12 小时前
U-Boot分析【学习笔记】(3)
linux·笔记·学习
螺丝钉的扭矩一瞬间产生高能蛋白12 小时前
QT的C++接口基础用法
c++·qt·嵌入式软件·嵌入式linux·linux应用
智者知已应修善业13 小时前
【51单片机模拟生日蜡烛】2023-10-10
c++·经验分享·笔记·算法·51单片机