我目前正在为特定游戏开发一个模组库,我遇到了菜单系统的一部分,我无法弄清楚它的用途。
有问题的表达是这样的:
unsigned num = ((n + 1) * 4) / 3 + 3;
然后游戏继续使用该值为菜单项结构分配空间:
void *newItemStorage = allocate(num * 0x18);
// 0x18 = sizeof(menu item structure)
n
是当前菜单项结构的数量,包含此数学运算的代码用于在当前不够时为更多结构分配空间(使用 将旧数组复制到新空间中memcpy
)。
据我所知,这个系统必须分配比它需要的更多的空间,以便将来需要发生的重新分配更少。但是,我不明白为什么必须使用这个特定的公式来计算空间。游戏存储num
仅在 时重新分配num < n + 1
。
我实际上是在计算公式时绘制了它的图形,所以这是该图形。(我曾经floor
尝试模拟整数除法。)我发现最令人困惑的部分num
之一是三人一组的事实:
从n = 0
1开始并增加 1 收益率:
4, 5, 7, 8, 9, 11, 12, 13
.
如果这是一些预分配内存的系统,为什么要这样做?如果不是,系统在做什么?