*(void**)是什么意思

what does the *(void**) means

本文关键字:意思 是什么 void      更新时间:2023-10-16

>我在网上看到过这样的课程,头文件

#ifndef _COMMON_ARRAY_OBJECT_POOL_H_
#define _COMMON_ARRAY_OBJECT_POOL_H_
#include <stdint.h>
namespace easynet
{
class ArrayObjectPool
{
public:
    /** construct
     * @param elem_size : element size;
     * @param elem_num  : element number
     */
    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;}

    void* Get();

    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 文件

#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);
    //construct list
    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;    //list head
}
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;
}
}

问题是我不明白这意味着什么:

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**)是什么意思?谢谢!

它将内存视为用户数据类型与void*之间的union。 当块位于可用阻止列表中时,将使用void*

您可以将其视为:

union ObjectInObjectPool
{
    void* ptr_next_free_block;
    UserType content;
};

然后这个循环基本上是做的:

ObjectInObjectPool* node = m_Elements;
for(i=0; i<m_ElemNum-1; ++i) {
    node->ptr_next_free_block = node + 1;
    node = node->ptr_next_free_block;
}

除了程序员手动执行编译器的类型检查器通常执行的所有指针算术。

void*是指向非类型化内存的指针值。当你做*(void**)node = ...时,它真正在做的是*node = ...。但是,对于后者,您正在尝试将某些内容分配给void,这对于C++的类型系统没有意义;你必须像前者一样,把它投射到一个void**,这样*node就会是一个void*,而不是一个void,你可以分配给它。

node = *(void**)node只是node = *node,但强制类型系统工作。它只是"将内存的值分配给node *node解释为void*"。