我不知道完全避免malloc
,但你当然可以减少它。
基本概念是内存池。这是您分配的一个大缓冲区,您可以将其用于许多对象,而不是请求大量的小分配。
您可能会在实际情况中使用它,您将事件发送到队列中以由另一个线程处理。事件对象可能是小型结构,您确实需要避免malloc
每秒进行数千次调用。
答案当然是从池中提取这些事件对象。如果需要,您甚至可以使用部分池缓冲区来形成一个列表,以便您可以快速索引已返回池的内存。这些通常被称为free-lists。
您必须小心内存对齐,因为您可能会因数据未对齐而严重影响性能。但是你可以用一点数学来处理所有这些。
不要害怕这些概念。游泳池实际上不必那么复杂。考虑一下:
int ** matrix = malloc( rows * sizeof(int*) );
for( int i = 0; i < rows; i++ ) {
matrix[i] = malloc( cols * sizeof(int) );
}
我经常看到这种情况,这是我的一个小烦恼。当你可以这样做时,你为什么要这样做:
int ** matrix = malloc( rows * sizeof(int*) );
matrix[0] = malloc( rows * cols * sizeof(int) );
for( int i = 1; i < rows; i++ ) {
matrix[i] = matrix[i-1] + cols;
}
当然,这减少了这一点(但要注意第一行中潜在的对齐问题 - 为了清楚起见,我在这里忽略了它)
int ** matrix = malloc( rows * sizeof(int*) + rows * cols * sizeof(int) );
matrix[0] = (int*)matrix + rows;
for( int i = 1; i < rows; i++ ) {
matrix[i] = matrix[i-1] + cols;
}
最后一个例子的酷点是删除矩阵是多么容易=)
free( matrix );
哦,对矩阵进行归零同样简单......
memset( matrix[0], 0, rows * cols * sizeof(int) );