我试图了解sbrk
的工作原理。
这是我的小代码:
int main()
{
printf("end of the break : %p\n", sbrk(0));
printf("end of the break : %p\n", sbrk(10));
printf("new end of the break : %p\n\n", sbrk(0));
}
输出:
end of break : 0xaa6000 end of break : 0xac7000 new end of the break : 0xac700a
为什么前2个地址之间存在差异 0xac7000 - 0xaa6000 = 21000而不是10?
答案 0 :(得分:7)
sbrk(n)
将中断增加n
并返回中断的旧值。
因此:
printf("end of the break : %p\n", sbrk(0));
输出:end of the break : 0xaa6000
最初,中断为0xaa6000,sbrk
来电不会更改。
printf("end of the break : %p\n", sbrk(10));
输出:end of the break : 0xac7000
这是你要问的价值。上面我说sbrk(0)
不会改变休息时间,为什么我们在这里得到不同的值?
在sbrk
两个printf
来电之间发生的唯一事情是对第一个malloc
的调用。据推测,stdio实现的内部使用sbrk
(例如创建缓冲区),而后者又调用printf
本身。换句话说,malloc
在内部调用sbrk
,使用 printf("new end of the break : %p\n\n", sbrk(0));
保留内存。
new end of the break : 0xac700a
输出:sbrk(10)
这次我们看到增量为0xa,与之前的printf
来电完全匹配。显然这次malloc
不需要分配动态内存(如果确实如此,sbrk
能够完成从第一个SELECT Table1.ID_1, Table1.ID_2, Table2.OtherInfo
FROM Table1 INNER JOIN Table2 ON ((Table1.ID_2 = Table2.ID_2) AND (Table1.ID_1 = Table2.ID_1))
OR ((Table1.ID_1 = Table2.ID_1) AND Table1.ID_2 IS NULL AND Table2.ID_2 IS NULL)
获得的空间内的所有内容,所以它没有必要从OS请求更多。)