【发布时间】:2018-02-13 09:56:21
【问题描述】:
我正在阅读和尝试这本书中的指针,
http://shop.oreilly.com/product/0636920028000.do
在本书第 6 章的 Avoiding malloc/free Overhead 标题下 作者建议在进行大量结构内存分配/释放时如何避免 malloc/free 开销。
下面是他写函数的方式,
#define LIST_SIZE 10
Person *list[LIST_SIZE];
void initializeList()
{
int i=0;
for(i=0; i<LIST_SIZE; i++)
{
list[i] = NULL;
}
}
Person *getPerson()
{
int i=0;
for(i=0; i<LIST_SIZE; i++)
{
if(list[i] != NULL)
{
Person *ptr = list[i];
list[i] = NULL;
return ptr;
}
}
Person *person = (Person*)malloc(sizeof(Person));
return person;
}
void deallocatePerson(Person *person)
{
free(person->firstName);
free(person->lastName);
free(person->title);
}
Person *returnPerson(Person *person)
{
int i=0;
for(i=0; i<LIST_SIZE; i++)
{
if(list[i] == NULL)
{
list[i] = person;
return person;
}
}
deallocatePerson(person);
free(person);
return NULL;
}
我从他的代码中了解到,他创建了一个内存池数组,指向 struct person 类型,然后用 NULL 初始化每个数组元素。
接下来我们将使用 getPerson 函数从池中获取内存。这个函数检查 !=NULL 我认为每次都会失败。所以它还是一样的,因为做 malloc 和内存不会随时从池中分配。
- 我的理解正确吗?
- 这是处理开销的方法吗?
- 正确的方法应该是什么?任何来源/链接将不胜感激。
【问题讨论】:
-
在大多数(但不是全部)情况下,
malloc足够快(例如,在我的 PC 上不到一微秒)。我建议在进行此类优化之前进行基准测试。 -
@BasileStarynkevitch 如何进行基准测试?
-
但是这些功能也会增加开销。不是吗?
标签: c