我是新手,可以用一个简短的例子告诉brk
和sbrk
之间的确切区别吗?是否有任何效率因素可供选择?
malloc
和new
内部呼叫brk
或sbrk
。
答案 0 :(得分:6)
int brk(void *addr);
brk()将数据段的结尾设置为指定的值 addr,当该值合理时,系统有足够的内存, 并且该过程不超过其最大数据大小。
成功时,brk()返回零。出错时,返回-1,并返回错误 设置为ENOMEM。
void *sbrk(intptr_t increment);
sbrk()按递增字节递增程序的数据空间。 调用增量为0的sbrk()可用于查找当前值 程序中断的位置。
成功时,sbrk()返回上一个程序中断。 (如果休息 增加了,那么这个值是指向新开始的指针 分配内存)。出错,返回(void *) - 1,错误是 设为ENOMEM。
答案 1 :(得分:2)
brk
设置数据段的上限,sbrk
递增它。在古代Unix malloc/free
中使用sbrk
。在现代的情况下,事情可能会有很大不同,例如,OSX不使用brk/sbrk
来管理堆分配,但mmap
,brk/sbrk
存在,但只是在一小段内存中进行仿真。这在Linux上几乎相同(提及从brk / sbrk到mmap的过渡历史的源代码)。