假设的 malloc / free 实现,带有要释放的显式大小参数

Hypothetical malloc / free implementation with explicit size parameter to free

在释放函数需要大小的情况下,动态内存分配和释放有什么优势吗?API

更重要的是,由于 free 不将大小作为参数,因此 table 是否有任何有趣的动态内存分配实现?

mallocfree 库函数有一个有趣的不对称性。 free 不需要 free 的大小。

void *malloc(size_t size);

void free(void *ptr);

这意味着 malloc 实现必须将元数据存储在某处,以便 free 可以完成它的工作*。

如果 API 是:

void free(void *ptr, size_t size);

您能否为这些函数编写一个缓存效率更高、总体内存使用量更少或具有更多一些令人满意的功能的实现?属性?

*我不认为要求大小来释放东西会完全消除存储某种元数据的需要,但它可以大大简化它。

Would there be any advantages to a dynamic memory allocation and deallocation API where the deallocation function requires the size?

是的,可以将用户提供的大小与系统对大小的理解进行比较。或者,系统甚至不需要跟踪大小。

然而,用户会需要进行跟踪,这有一个缺点。底层分配系统可以更多地访问尺码信息,并且可以比用户更有效、更忠实地这样做。

... uses less memory overall, ...

不太可能,因为底层分配系统可以执行超越可移植 C 的效率技巧,而不是让用户承担同样的负担。


标准 C 库设计选择是很久以前做出的,有利于底层系统保持跟踪。


典型的包装器可以使用 my_alloc(size) 和 over-allocate 来存储元数据,并使用 my_free(ptr, size) 来执行此检查。