看到别人写的一个类. 具体代码如下
ArrayObjectPool.h
#ifndef _COMMON_ARRAY_OBJECT_POOL_H_#define _COMMON_ARRAY_OBJECT_POOL_H_#include <stdint.h>namespace easynet{class ArrayObjectPool{public: /** 构造函数 * @param elem_size : 元素大小(字节).小于4字节将被调整为4; * @param elem_num : 元素个数 */ ArrayObjectPool(uint32_t elem_size, uint32_t elem_num); ~ArrayObjectPool(); uint32_t ElemSize(){return m_ElemSize;} uint32_t Capacity(){return m_ElemNum;} bool IsEmpty(){return m_FreeHead==NULL;} /** 获取元素 * @return : 返回元素指针,无空闲元素可用返回NULL; */ void* Get(); /** 回收元素 * @param elem : 待回收的元素 * @return : true成功;false失败,elem非本对象元素; */ bool Recycle(void *elem);private: void *m_Elements; void *m_End; void *m_FreeHead; uint32_t m_ElemSize; uint32_t m_ElemNum;};}#endif //_COMMON_ARRAY_OBJECT_POOL_H_
cpp文件
/* * ArrayObjectPool.cpp * * Created on: Apr 18, 2013 * Author: LiuYongJin */#include <assert.h>#include <stddef.h>#include <stdlib.h>#include "ArrayObjectPool.h"namespace easynet{ArrayObjectPool::ArrayObjectPool(uint32_t elem_size, uint32_t elem_num){ m_ElemNum = elem_num; if(elem_size < sizeof(void*)) m_ElemSize = sizeof(void*); else m_ElemSize = elem_size; m_Elements = malloc(m_ElemSize*m_ElemNum); m_End = (void*)((char*)m_Elements+m_ElemSize*m_ElemNum); assert(m_Elements != NULL); //构建链表 int i; void *node = m_Elements; for(i=0; i<m_ElemNum-1; ++i) { *(void**)node = (void*)((char*)node+m_ElemSize); node = *(void**)node; } *(void**)node = NULL; m_FreeHead = m_Elements; //链表头}ArrayObjectPool::~ArrayObjectPool(){ free(m_Elements);}void* ArrayObjectPool::Get(){ if(m_FreeHead == NULL) return NULL; void *temp = m_FreeHead; m_FreeHead = *(void**)m_FreeHead; return temp;}bool ArrayObjectPool::Recycle(void *elem){ if(elem<m_Elements || elem>=m_End) return false; *(void**)elem = m_FreeHead; m_FreeHead = elem; return true;}}
我的迷惑是不太明白
for(i=0; i<m_ElemNum-1; ++i){ *(void**)node = (void*)((char*)node+m_ElemSize); node = *(void**)node;}
这段的意义是什么, 另外*(void**)
的赋值的作用? 谢谢
解决方案
这段的意义是什么
之前在构造函数中malloc了大小为m_ElemSize*m_ElemNum的空间,然后m_Elements指向它。
把这段空间想成元素大小是m_ElemSize元素个数是m_ElemNum的数组
这个for循环的作用是将每个元素(不包含最后一个)的前32/64位赋值为下一个元素的地址(就像链表)
另外*(void**)的赋值的作用
node是一个void*类型的指针,*(void**)是先强转为void**类型(其实都是指针占的内存大小都一样)然后再用*取值