代码之家  ›  专栏  ›  技术社区  ›  Greg Nisbet

假设malloc/free实现,显式size参数为free

  •  0
  • Greg Nisbet  · 技术社区  · 6 年前

    在释放函数需要大小的情况下,动态内存分配和释放API是否有任何优势?

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

    这个 malloc 自由的 库函数有一个有趣的不对称性。 自由的 不需要 自由的 “d”的东西。

    void *malloc(size_t size);
    

    vs公司

    void free(void *ptr);
    

    这意味着 马洛克 实现必须将元数据存储在某个位置,以便 自由的 可以完成它的工作*。

    如果API改为:

    void free(void *ptr, size_t size);
    

    您能为这些函数编写一个缓存效率更高、总体内存使用更少或具有更多理想特性的实现吗?

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   chux    6 年前

    在释放函数需要大小的情况下,动态内存分配和释放API是否有任何优势?

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

    然而,用户会在 需要 保持跟踪。底层分配系统有更多的权限访问大小信息,并且可以比用户更高效、更忠实地执行此操作。

    。。。总体上使用更少的内存。。。

    不太可能,因为底层的分配系统可以在portable C之外更好地执行效率技巧,而不是让用户承担同样的负担。


    标准C库设计选择早就有利于底层系统跟踪。


    典型的包装器可以使用 my_alloc(size) 并过度分配以存储元数据 my_free(ptr, size) 进行此检查。