首页 > 解决方案 > 铸造一个结构

问题描述

我目前正在学习内存池实现。问题是我不太了解下面的类型转换方式:

b3BlockPool::b3BlockPool(u32 blockSize)
{
    m_blockSize = blockSize;
    m_chunkSize = b3_blockCount * m_blockSize;

    m_chunks = NULL;
    m_chunkCount = 0;

    // Pre-allocate some chunks
    b3Chunk* chunk = (b3Chunk*)b3Alloc(sizeof(b3Chunk) + m_chunkSize);
    ++m_chunkCount;
    chunk->freeBlocks = (b3Block*)((unsigned char*)chunk + sizeof(b3Chunk)); //here
}

在最后一行,块指针首先被转换为 unsigned char*,这是为什么呢?

为什么我们不能这样做呢?

chunk->freeBlocks = (b3Block*)(chunk + sizeof(b3Chunk));

这是 .h 文件以获取更多信息:

// Number of blocks per chunk.
const u32 b3_blockCount = 32;

// A pool of memory blocks.
class b3BlockPool
{
public:
    b3BlockPool(u32 blockSize);
    ~b3BlockPool();

    void* Allocate();
    void Free(void* p);
private:
    struct b3Block
    {
        b3Block* next;
    };

    struct b3Chunk
    {
        b3Block* freeBlocks;
        b3Chunk* next;
    };

    u32 m_blockSize;
    u32 m_chunkSize;

    b3Chunk* m_chunks;
    u32 m_chunkCount;
};

标签: c++

解决方案


推荐阅读