关于类型转换的 C++ 问题

标签 c++ casting

为什么在下面的代码示例中分配缓冲区时将 char* 转换为 char**,以及 这里发生了什么?

first_ = *reinterpret_cast<char **>(first_);

        //CODE SAMPLE
    public:    
        char * Allocate()
        {
            if (!first_)
                return 0;
            char *result = first_;
            first_ = *reinterpret_cast<char **>(first_); // WHY?
            --available_;
            return result;
        }




    private:
        char *buffers_;
        char *first_;
        std::size_t available_;
        std::size_t maxnum_;
        std::size_t buffersize_;

    //WHOLE CLASS IS HERE

    class Chunk
    {
    public:
        Chunk(std::size_t buffersize, std::size_t buffernum)
            : buffers_(0),
              first_(0),
              available_(0),
              maxnum_(0),
              buffersize_(0)
        {
            assert(buffersize > sizeof(char *) && buffernum > 0);
            std::size_t len = buffersize * buffernum;
            buffers_ = new char[len];
            first_ = buffers_;
            available_ = buffernum;
            maxnum_ = buffernum;
            buffersize_ = buffersize;

            char *begin = buffers_;
            char *end = buffers_ + len - buffersize_;
            *reinterpret_cast<char **>(end) = 0;
            for (; begin < end; begin += buffersize_)
            {
                char **next = reinterpret_cast<char **>(begin);
                *next = begin + buffersize_;
            }
        }

        ~Chunk()
        {
            delete [] buffers_;
        }

        char * Allocate()
        {
            if (!first_)
                return 0;
            char *result = first_;
            first_ = *reinterpret_cast<char **>(first_);
            --available_;
            return result;
        }

        void Deallocate(char *buffer)
        {
            *reinterpret_cast<char **>(buffer) = first_;
            first_ = buffer;
            ++available_;
        }

        bool IsFull() const
        {
            return available_ == 0;
        }

        // the buffer is one of this chunk
        bool IsChunkBuffer(char *buffer) const
        {
            assert(buffer);
            return buffer >= buffers_ && buffer < buffers_ + maxnum_ * buffersize_;
        }

    private:
        char *buffers_;
        char *first_;
        std::size_t available_;
        std::size_t maxnum_;
        std::size_t buffersize_;
    };

最佳答案

它是一个池分配器。在每个空闲 block 的开头,都有一个指向下一个空闲 block 的指针。执行上述代码时,first_ 指向一个空闲 block ,它是空闲 block 单链表中的第一个。然后它将 first_ 设置为下一个空闲 block 并返回前一个空闲 block ,因为它不再在空闲 block 列表中而被分配。

关于关于类型转换的 C++ 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6971180/

相关文章:

c++ - 如何确定两个3d边缘是否相同?

c++ - const-promotion 在哪里定义

java - 创建访问单个特定类型的通用数组

C++ 将 void 指针转换为模板类

c - 在 C 中完成指针转换时,字节会被交换

c++ - 有没有办法用详细的缓存/CPU 效率信息来分析 MPI 程序?

C++隐式转换规则

c++ - 使用 SDL2 C++ 时出现应用程序无法正确启动 (0xc000007b) 错误

java - 转换为自定义 ArrayList

c# - 为什么向下转换在运行时失败