作为赋值的一部分,我们必须实现(基本)malloc函数(我们应该以某种方式模拟动态内存分配)。我已经实现了一个基于隐式空闲列表的解决方案,但问题是我获得了50%的利用率和9%的吞吐量(我必须获得90%的利用率+吞吐量)。隐式空闲列表的问题在于搜索空闲块需要很多时间。所以我想实现explicit free list以了解程序可以改进多少。现在的问题是我必须跟踪免费块的next / prev指针。因为我只能使用标量变量而不能使用任何类型的数据结构,例如:linked list,struct,..,我无法实现它。有人可以指出我如何跟踪C中的(虚拟)指针?
感谢,
答案 0 :(得分:0)
从幻灯片中的图片(在评论中链接),我认为您应该将链接存储为整数偏移。
在C中,这最好被描述为结构。
struct alloc_cell {
int size;
int forward;
int back;
int data[];
};
现在,他在最后也重复了这个大小,并且用结构来描述更难。 目前尚不清楚它的必要性。它用于边界合并。
编辑:很久以后,考虑发表评论。
即使您不能在代码中使用结构,您仍然可以在伪代码中使用它们来帮助组织您的思考。 struct字段属于同一类型,自然地映射到数组 可以通过指向第一个成员/元素的指针访问的代表。
struct alloc_cell { // int *cell;
int size; // cell[0] // *cell
int forward; // cell[1]
int back; // cell[2]
int data[]; // (cell+3)[...] // &cell[3]
};
你甚至可以给予这些偏移助记符名称(但这可能被视为 overkill 和不必要的混淆)。
enum { SIZE, FORWARD, BACK, DATA };
cell[SIZE]; // alloc_cell.size
cell[FORWARD]; // alloc_cell.forward
cell[BACK]; // alloc_cell.back
cell+DATA; // &cell[DATA] // alloc_cell.data