首页 > 关于*(void**)的问题

关于*(void**)的问题

看到别人写的一个类. 具体代码如下
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**类型(其实都是指针占的内存大小都一样)然后再用*取值

【热门文章】
【热门文章】