虽然我认为这不是一个好主意,但一种解决方案是预先分配各种日志2大小的存储桶,愚蠢的伪代码:
class Allocator {
void* malloc(size_t size) {
int bucket = log2(size + sizeof(int));
int* pointer = reinterpret_cast<int*>(m_buckets[bucket].back());
m_buckets[bucket].pop_back();
*pointer = bucket; //Store which bucket this was allocated from
return pointer + 1; //Dont overwrite header
}
void free(void* pointer) {
int* temp = reinterpret_cast<int*>(pointer) - 1;
m_buckets[*temp].push_back(temp);
}
vector< vector<void*> > m_buckets;
};
(您当然也可以std::vector
用简单的数组 + 计数器替换)。
编辑:为了使它健壮(即处理桶为空的情况),您必须添加某种形式的分支。
EDIT2:这是一个小的无分支log2
函数:
//returns the smallest x such that value <= (1 << x)
int
log2(int value) {
union Foo {
int x;
float y;
} foo;
foo.y = value - 1;
return ((foo.x & (0xFF << 23)) >> 23) - 126; //Extract exponent (base 2) of floating point number
}
这给出了分配 < 33554432 字节的正确结果。如果您需要更大的分配,您将不得不切换到双打。
这是浮点数在内存中表示方式的链接。