我分配了大缓冲区,然后拆分成多个大小的块。这些大小从32开始,然后每增加2乘以。
struct Node
{
Node* Next;
void* Data;
const unsigned Size;
};
Node* m_Buffers[16];
这意味着m_Buffers[0]
的缓冲区大小为32,m_Buffers[1]
的缓冲区大小为64,依此类推。
一个函数,它接受一个数字并返回一个指定数字可以舍入的大小的缓冲区。
void * GetBuffer(unsigned size)
{
// ...
}
例如,如果我请求一个384的缓冲区,那么我需要能够在512处舍入它并从m_Buffers[4]
返回一个缓冲区。
到目前为止,我使用循环来进行整理:
void * GetBuffer(unsigned size)
{
unsigned buffer_size = 32;
while (buffer_size < size)
{
buffer_size *= 2;
}
// ...
}
但我很好奇是否有更好的方法可以完成并不涉及循环。如果有一种方法可以在不使用switch语句的情况下将舍入数转换为数组中的索引。
说实话,我甚至不确定标题是否正确。所以我为此道歉。
答案 0 :(得分:6)
您可以使用this bit triddling hack:
unsigned int v;
v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v++;
这个想法是贴上&#34;粘贴&#34;所有位置中v-1
的最高有效位(MSB)低于MSB本身,产生多个形式2 k -1。之后,数字会递增以得出最终结果。
答案 1 :(得分:1)
您可以使用一个函数来确定2的下一次幂而不进行循环。看到这个链接: