gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:36:34 26 4
gpt4 key购买 nike

为什么在下面的代码示例中分配缓冲区时将 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com