def allocate_best_fit(self, size):
size = MemoryManager.align(size, self.alignment)
best_node = None
best_offset = None
best_delta = six.MAXSIZE
offset = 0
for i, node in enumerate(self.node_list):
delta = node.size - size
if node.is_free and delta >= 0:
if not best_node or delta < best_delta:
best_i = i
best_node = node
best_offset = offset
best_delta = delta
offset += node.size
if not best_node:
raise RuntimeError("Bad Allocation")
else:
if best_delta == 0:
best_node.is_free = False
else:
self.node_list[best_i].size -= size
self.node_list.insert(best_i, MemoryNode(size, is_free=False))
self.max_allocation = max(self.max_allocation, best_offset + size)
return best_offset
评论列表
文章目录