我有我的C列表,并且实现了push_back
函数:
bool_t push_back_clist(clist_ptr pList, void* item)
{
if(pList)
{
node_ptr pNode = new_node(item, pList->sizeof_item);
if(!pNode) return FALSE;
if(!pList->head)
pList->head = pList->tail = pNode;
else
{
pList->tail->next = pNode;
pNode->prev = pList->tail;
pList->tail = pNode;
}
pList->size++;
return TRUE;
}
return FALSE;
}
static node_ptr new_node(void* data, size_t sizeof_item)
{
node_ptr pNode = (node_ptr) malloc(sizeof(node_t));
if(!pNode) return NULL;
pNode->data = malloc(sizeof_item);
if(!pNode->data)
{
free(pNode);
return NULL;
}
memcpy(pNode->data, data, sizeof_item);
pNode->next = pNode->prev = NULL;
return pNode;
}
它可以工作,但是当我将
push_back_clist
函数与std::list.push_back
方法进行比较时,我注意到我的函数所需时间大约是它的两倍。为什么?如何改善功能的性能?谢谢。
最佳答案
您可以一次性分配数据和节点,以节省malloc
调用的次数。
char* mem = malloc(sizeof(node_t)+sizeof_item);
// Check alloc here...
node_ptr pNode = (node_ptr)mem;
pNode->data = mem+sizeof(node_t);