malloc()
简单地分配内存,而 calloc()
分配一些内存并急切地清除它。 还有 realloc()
和 free()
,它们相当简单明了。
malloc()
的manpage还提到了 valloc()
函数,该函数将(`size`)字节分配给页面边界对齐。不幸的是,我的背景在低级细节方面不够充分。 分配和使用页面边界对齐的内存有什么影响,以及何时适用于常规的
malloc()
或 calloc()
?malloc()
简单地分配内存,而 calloc()
分配一些内存并急切地清除它。 还有 realloc()
和 free()
,它们相当简单明了。
malloc()
的manpage还提到了 valloc()
函数,该函数将(`size`)字节分配给页面边界对齐。malloc()
或 calloc()
?valloc
函数的man手册包含一条重要的注释:
函数valloc()出现在3.0BSD中。在4.3BSD中,它被记录为已过时,在SUSv2中被记录为遗留代码。它不出现在POSIX.1-2001中。
valloc
已经过时且非标准化 - 回答你的问题,新编写的代码中永远不会适用它。
虽然有一些原因需要分配对齐的内存 - this question列举了一些好的原因 - 但通常最好让内存分配器决定给你哪块内存。如果您确定需要将新分配的内存对齐到某个位置,请改用aligned_alloc
(C11)或posix_memalign
(POSIX)。
valloc
在posix_memalign
手册页中有讨论,而man valloc
将会调出它。 - Nate Eldredgemalloc()
手册页中提到了这一点。我现在也在 Ubuntu Xenial 上,但没有找到相关内容。但我看到了混淆之处,可能是我不小心删除了部分评论并没有注意到。 - Iharob Al Asimi显然的答案是,在应用程序(虚拟)内存使用模式下,malloc不适用(效率较低),valloc更加适合(更高效),因此在这种情况下应该使用valloc。这将取决于操作系统、库和架构以及应用程序…
传统上,malloc会从可用的空闲内存中分配真实内存,如果没有,则通过增加brk点来分配内存,在这种情况下,出于安全原因,操作系统会将其清除。
calloc在愚蠢的实现中会执行malloc,然后重新清除内存,而聪明的实现则会避免重新清除由操作系统自动清除的新分配的内存。
valloc与虚拟内存有关。在使用文件系统的虚拟内存系统中,您可以分配大量的内存或文件空间/交换空间,甚至超过物理内存,并且它将被页面交换,因此对齐是一个因素。在Unix中,创建指定文件并添加/删除页面是使用inode来定义文件完成的,但直到需要时才处理实际的磁盘块,在这种情况下,它会清除它们。因此,我希望valloc系统可以增加数据段交换的大小,而不实际分配物理或交换页面,也不运行for循环来全部清除-因为文件和分页系统会根据需要进行清除。因此,valloc应该比malloc快得多。但是,与calloc一样,如何特定的*x/C风格实现它取决于他们自己,并且valloc man页面对于这些期望毫无帮助。
传统上,这是通过brk / sbrk实现的。当然,在虚拟内存系统中,无论是分页还是分段系统,都没有必要进行任何brk / sbrk操作,只需将文件或地址空间中的最后位置写入以扩展到该点即可。
关于分配到页面边界,这通常不是用户想要或需要的,而是系统想要或需要的。
一种(可能更昂贵的)模拟valloc的方法是确定页面边界,然后使用此对齐规范调用aligned_alloc或posix_memalign。valloc
无法更快。 - Julesvalloc
已过时,应使用memalign
代替。_SC_PAGESIZE
边界。
valloc
是标准C或POSIX。因此,你的问题有点无用。如果你需要特定的对齐方式,请使用aligned_alloc
。 - too honest for this site