内存存储块
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