我正在编写一个程序,它将使用链表来分配内存。
目标是减少对malloc()
功能的调用次数。
为此,我想象以下分配函数:(head(Slot<T>*
)和free_slots(int
)是分配器的一部分)
inline T* allocate(size_t length)
{
if(free_slots == 0){
head = (Slot<T>*) malloc(length * sizeof(Slot<T>) * NBR_NEW_OBJECT);
free_slots = NBR_NEW_OBJECT;
}
T* result = &(head->data);
head = static_cast<Slot<T>* >(head->next);
return result;
}
我定义了Slot
结构:
template <typename T>
struct Slot{
T data;
Slot* next;
};
但是我们第二次进入allocate方法(第一次没问题)我有一个段错误。 你有什么想法吗?
答案 0 :(得分:0)
似乎好方法是之前初始化所有Slot->next
字段
所以正确的实施应该是:
inline T* allocate(size_t length)
{
if(free_slots == 0){
head = (Slot<T>*) malloc(length * sizeof(Slot<T>) * NBR_NEW_OBJECT);
free_slots = NBR_NEW_OBJECT;
for(int i = 0; i < NBR_NEW_OBJECT; i++)
head[i].next = reinterpret_cast<Slot<T>* >(&head[i+1]);
}
T* result = &(head->data);
head = reinterpret_cast<Slot<T>* >(head->next);
free_slots--;
return result;
}