Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
假设malloc/free实现,显式大小参数为free_C_Dynamic Memory Allocation - Fatal编程技术网

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

假设malloc/free实现,显式大小参数为free,c,dynamic-memory-allocation,C,Dynamic Memory Allocation,在释放函数需要大小的情况下,动态内存分配和释放API是否有任何优势 更重要的是,是否有任何有趣的动态内存分配实现因为free没有将大小作为参数而被排除在外 malloc和free库函数有一个有趣的不对称性free不需要free的大小 void *malloc(size_t size); vs 这意味着malloc实现必须将元数据存储在某个地方,以便free能够完成它的工作* 如果API为: void free(void *ptr, size_t size); 您能为这些函数编写一个更高效的缓

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

更重要的是,是否有任何有趣的动态内存分配实现因为
free
没有将大小作为参数而被排除在外

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

void *malloc(size_t size);
vs

这意味着
malloc
实现必须将元数据存储在某个地方,以便
free
能够完成它的工作*

如果API为:

void free(void *ptr, size_t size);
您能为这些函数编写一个更高效的缓存、使用更少的内存或具有更多理想特性的实现吗

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

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

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

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

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

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


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


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

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

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

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

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

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


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



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

Arghh。。。在不需要跟踪应用程序代码中的块大小的情况下,手动释放内存已经足够困难了。您可以通过方案获得任何显著优势的用例数量很少。它极易出错。然而,对于小型嵌入式环境来说,这可能是值得的。请注意,确实存在不需要每次分配元数据的分配方案。误用它可能会导致内存泄漏,例如,用户分配20个字节,只释放4个字节bytes@GeneUH我并不是说跟踪块大小比不跟踪它们更方便或更具竞争力。我只是想知道为了不自己追踪他们,你必须放弃什么。从您的评论来看,答案似乎是“如果有的话,也不算多”。该教程提供了一个答案,可以回答系统如何处理分配大小跟踪以及为什么
免费
不需要提供大小的一些(如果不是全部的话)原因(它是为32位分配编写的,但也可以调整为64位使用)是的,在显式存储块大小或使用块结束指针的系统中,每次分配最多可保存4或8个元数据字节。对于那些通过位置确定大小的文件,您可以保存一个通常只需几条指令的查找。Arghh。。。在不需要跟踪应用程序代码中的块大小的情况下,手动释放内存已经足够困难了。您可以通过方案获得任何显著优势的用例数量很少。它极易出错。然而,对于小型嵌入式环境来说,这可能是值得的。请注意,确实存在不需要每次分配元数据的分配方案。误用它可能会导致内存泄漏,例如,用户分配20个字节,只释放4个字节bytes@GeneUH我并不是说跟踪块大小比不跟踪它们更方便或更具竞争力。我只是想知道为了不自己追踪他们,你必须放弃什么。从您的评论来看,答案似乎是“如果有的话,也不算多”。该教程提供了一个答案,可以回答系统如何处理分配大小跟踪以及为什么
免费
不需要提供大小的一些(如果不是全部的话)原因(它是为32位分配编写的,但也可以调整为64位使用)是的,在显式存储块大小或使用块结束指针的系统中,每次分配最多可保存4或8个元数据字节。对于那些通过位置确定大小的人,你可以保存一个通常只需几条指令的查找。David Rankin链接的文章提到了malloc几乎肯定必须维护元数据本身的关键原因。释放块时,库不仅需要知道块的大小;它还需要知道周围的街区是否正在使用。如果它不能分辨,它就不能合并块,导致更多的碎片。图书馆可以避免这种情况
void free(void *ptr, size_t size);