动态内存分配和释放API是否有任何优势,其中释放函数需要大小?
更重要的是,是否存在任何有趣的动态内存分配实现,因为free
不会将大小作为参数?
malloc
和free
库函数具有有趣的不对称性。 free
不需要free
void *malloc(size_t size);
VS
void free(void *ptr);
这意味着malloc
实现必须将元数据存储在某处,以便free
可以完成其工作*。
如果改为使用API:
void free(void *ptr, size_t size);
您是否可以编写这些函数的实现,这些函数的缓存效率更高,整体使用的内存更少,或者具有更多一些理想的属性?
*我不相信要求大小来释放东西会完全消除存储某种元数据的需要,但它可以大大简化它。
答案 0 :(得分:2)
动态内存分配和释放API是否有任何优势,其中释放函数需要大小?
是的,用户提供的尺寸可以与系统了解尺寸进行比较。 Alternativley系统甚至不需要跟踪大小。
然而,用户需要需要来跟踪,这是一个缺点。底层分配系统可以更多地访问大小调整信息,并且可以比用户更有效,更忠实地执行此操作。
...整体使用更少的内存,......
不太可能因为基础分配系统可以比便携式C更好地执行效率技巧,而不是用户做同样的负担。
标准C库设计选择很久以前就有利于底层系统跟踪。
典型的包装器可以使用my_free(ptr, size)
并过度分配以存储元数据,{{1}}可以执行此检查。