3 回答
TA贡献1816条经验 获得超6个赞
malloc和free是标准C库函数,其是由每个C实现来实现。
C标准仅定义了这些函数的行为方式以及预期的行为。在每种实现方式中如何实现它们。
简而言之,它们是您使用的实现的实现细节。
(“实现”由编译器,链接器,运行时库以及其他一些东西组成。)
TA贡献1803条经验 获得超6个赞
很多时候,malloc并且free正在使用较低级别的虚拟内存分配服务,并使用诸如mmap和munmap(甚至可能是sbrk)之类的系统调用一次分配多个页面(甚至兆字节)。相关时,通常倾向于重用以前的 d存储空间。大多数实现对“大”和“小”分配使用各种不同的策略,等等。malloc freemalloc
注意,可以限制虚拟地址空间,例如使用setrlimit(2)。在Linux pmap(1)和proc(5)上使用,以了解有关某个进程的虚拟地址空间的更多信息(例如,/proc/self/maps对于您自己的进程,或者/proc/1234/maps-对于pmap 1234命令-对于pid 1234的进程)。
您可以查看GNU libc源代码,其他C标准库的源代码(例如musl-libc),了解malloc实现,选择其他实现或自己实现,或者使用strace进行实验性查找。
阅读syscalls手册页(即syscalls(2))和<asm/unistd.h>有关系统调用列表的文件。
很快 malloc
(我相信这可能是最快的实现malloc;但是它不是很有用;它符合标准)
我坚信C标准对于malloc和非常模糊free。我很确定以下功能会遵守该标准的文字(但不是精神):
/* politically incorrect, but very probably standard conforming */
void *malloc (size_t sz) { if (sz>0) errno = ENOMEM; return NULL; }
void free(void*ptr) { }
当然,您将进行编码calloc并realloc据此进行编码。
(顺便说一句,每个使用的代码malloc都应该测试其失败,但是某些错误地测试错误;malloc可以返回NULL失败,人们应该针对这种情况进行测试)
GNU libc为您提供了自己的函数的钩子malloc(您甚至可以透明地通过它们使用Boehm的垃圾收集器)。这些挂钩可能会被弃用并且是非标准的。
如果使用GNU libc,则还要查看mallinfo(3)和malloc_stat(3)以及相关功能。
- 3 回答
- 0 关注
- 654 浏览
添加回答
举报