gpt4 book ai didi

c++ - 具有密集和稀疏指针的分配器 - 发生了什么事?

转载 作者:行者123 更新时间:2023-11-28 05:01:44 24 4
gpt4 key购买 nike

我正在尝试用 C++ 编写一个句柄分配器。该分配器将“处理”(hue hue hue) 游戏引擎中引用 Assets (如纹理、制服等)的句柄分配。例如,在创建纹理的函数中,将调用句柄分配器来创建一个 TextureHandle。当纹理被销毁时,句柄分配器将释放 TextureHandle。

我正在阅读 BX 的来源,一个包含用于此目的的句柄分配器的库 - 它是流行库的基础库 BGFX ,对不同渲染 API 的跨平台抽象。

在开始解释令我困惑的事情之前,让我先概述一下这个类的本质:

class HandleAllocator {
public:

constructor, destructor
getters: getNumHandles, getMaxHandles
u16 alloc();
void free(u16 handle);
bool isValid(u16 handle) const;
void reset();

private:

u16* getDensePointer() const;
u16* getSparsePointer() const;
u16 _numHandles;
u16 _maxHandles;
}

这是 getDensePointer() 的样子:

u8* ptr = (u8*)reinterpret_cast<const u8*>(this);
return (u16*)&ptr[sizeof(HandleAlloc)];

据我所知,这个函数返回一个指向内存中类末尾的指针,虽然我不明白为什么 this 指针在之前首先被转换为 uint8_t*被取消引用并在下一行与数组索引运算符一起使用。

这就是我觉得奇怪的地方。构造函数调用 reset() 函数,如下所示。

_numHandles = 0;
u16* dense = getDensePointer();
for(u16 ii=0, num = _maxHandles; ii < num; ++ii) {
dense[ii] = ii;
}

如果 getDensePointer 返回一个指向内存中类末尾的指针,那么在此 for 循环中写入类末尾以外的内存如何安全?我怎么知道这不是踩到存储在它附近的东西?

我完全是个菜鸟,我意识到这个问题的答案可能很明显,并且暴露出我完全缺乏知识,但是对我放宽点..

最佳答案

要回答第一个问题,问问自己为什么指针有类型。最后,它们只是用来存储内存地址的变量。任何范围大到足以存储所有可能的内存地址的变量都可以。比方说,int*u8* 之间有什么区别?

区别在于对它们执行操作的方式。除了取消引用(这是另一回事)之外,还涉及指针运算。让我们采用以下声明: int *p; u8 *u;。现在,p+2 为了有意义,将返回 p+8 处的地址(第二个整数的地址,如果您愿意的话),而 u+2 将返回u+2(因为 u8 的大小为 1)。

现在,sizeof 以字节为单位为您提供类型的大小。你想移动 sizeof(x) 字节,所以你需要在字节大小的数据类型上索引数组(或做指针算术,它们在这里是等价的)。这就是将其转换为 u8 的原因。

现在,对于第二个问题,

how do i know this isn't stomping on something stored adjacent to it?

只需确保那里没有任何东西。这是在创建处理程序期间完成的。例如,如果您有:

HandleAllocator *h = new HandleAllocator[3]

您可以在 h[0] 上自由调用 reset 并有 2 个值得内存的处理程序可以使用。如果没有更多细节,很难说出这些多余内存的确切分配方式及其用途。

关于c++ - 具有密集和稀疏指针的分配器 - 发生了什么事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45766837/

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