假设你想要实现的是最小化分配内存所花费的时间并可能改善缓存局部性,实际上这听起来很简单。
只需选择内存管理器(写一个或使用预先存在的如Hoard)。然后,让内存管理器分配在程序开始的一个周期内使用的最大内存量。
主要问题是计算这个内存量。一个简单的解决方案是使用一个分配器完成一个循环,除了将malloc / free与计数器一起包装,该计数器跟踪当前内存使用情况和最大使用量。在周期结束时,最大值是您应该在开始时分配的数量。
需要注意的一件事是,分配的内存中的碎片可能导致需要额外的分配。一个好的内存管理器通常可以避免这种情况。在最坏的情况下,您可能必须分别跟踪为每个分配大小分配的最大内存。
作为旁注,如果您使用的是C ++,为什么使用malloc / free而不是new / delete?
更确切地说,相同的malloc / free操作序列是 重复多次(在每个循环结束时,一切都被释放)。所以 我可以负担一些计算来优化内存使用。
对于内存使用,这不是一个难以解决的问题。同样的内存将被重新分配用于相同的目的,因此如果你一遍又一遍地分配相同的内存块,那么它不会“浪费”内存。
既然你说, malloc 和 free ,我们是在谈论旧式“C”型堆的用法吗?那么没有建设者或破坏者可以担心吗?那么为什么不创建给定类型的元素数组,例如
malloc
free
struct X { ... };
旧代码:
X* px[10]; for(i = 0; i < 10; i++) { px[i] = malloc(sizeof(X)); ... }
改为做:
X* px[10]; X* xx = malloc(sizeof(X)*10); for(i = 0; i < 10; i++) { px[i] = &xx[i]; }