(一)动态的内存结构 CvMemBlock

 

内存存储块

 

typedef struct CvMemBlock

{

    struct CvMemBlock*  prev;

    struct CvMemBlock*  next;

}

CvMemBlock;

 

 

解释:

CvMemBlock 代表一个单独的内存存储块结构。 内存存储块中的实际数据存储在 header块 之后(即:存在一个头指针 head 指向的块 header ,该块不存储数据),于是,内存块的第 i 个字节可以通过表达式 ((char*)(mem_block_ptr+1))[i] 获得。然而,通常没必要直接去获得存储结构的域。

 

我的理解:以下一个方框代表4个字节

则一个内存块结构为  CvMemBlock block;

 指针prev

 指针next

 实际的数据

 实际数据

 。。。

 。。。

 。。。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 。。。


其中内存块的内存分配与下一个结构有关

动态内存存储器

 

typedef struct CvMemStorage

{

    int signature;

    CvMemBlock* bottom;           /* First allocated block.                   */

    CvMemBlock* top;              /* Current memory block - top of the stack. */

    struct  CvMemStorage* parent; /* We get new blocks from parent as needed. */

    int block_size;               /* Block size.                              */

    int free_space;               /* Remaining free space in current block.   */

}

 

 

其中block_size定义了每个CvMemBlock的大小,上图为4*8*3=96

 

其实就是一个堆栈

栈的单元为一个CvMemBlock块,其大小已定为block_size

bottom为栈底,top为栈顶,top部分被数据占据

             top指针。。

 。。。。。。。。。。

 。。。。。。。。。。

 。。。。。。。。。。

 。。。。。。。。。。

 。。。。。。。。。。

 。。。。。。。。。。

bottom指针。。。。

以上就可以是个CvMemStorage,但是每层之间不是依靠物理位置联系,是用双向指针联系在一起,这保证了动态性质。

 

从存储器中分配内存的函数为

CvMemStorageAlloc

其分配原理为,如果分配大小小于top块的free_space则直接分配,减小free_space就行了。如果不够分配,则重新找到一块新的存储块。

有以前申请的后继存储块,就把top指针后移。

其次,有父存储器的话,向父存储器要。肯定给,因为递归调用,父存储器按照这3条规则找到新的存储块

最后没辙了,就自己申请一块新的存储块。

 

 

释放内存块函数为

CvReleaseMemStorage

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值