我写了下面的程序,
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include "rand.h"
int main (int argc, char* argv[]) {
void *x = sbrk(0);
printf("The initial top of the heap is %p.\n", x);
void *y = sbrk(0);
printf("The current top of the heap is %p.\n", y);
printf("The difference is %d (%x)\n", (int) (y-x), (int) (y-x));
return 0;
}
我明白为什么堆中断不同,因为它必须为要打印的调用分配堆空间。
我不明白为什么在我的 x86_64 Linux 计算机上,差异具体是 25600 字节。
比如,字符串本身可能只需要少量的字节(每个字节一个字符,在堆中向字符串添加一些头数据),根本不需要 1000 个字节,对吗?
我有点猜测这可能与分页有关——目前我还不太明白这一点。但从简单的搜索来看,分页似乎每次只分配大约 4000 个字节,所以可能也不是这样,对吧?
也许各种include
s 与此有关?老实说,我根本不知道这对堆内存有何影响。
不管怎样,直接的问题是:为什么该程序会导致堆内存移动25600字节?
因为“打印”分配了内存,所以移动了堆中断。在调试器下运行程序,您可能会观察到:
该分配来自 glibc 在https://github.com/lattera/glibc/blob/master/libio/fileops.c#L752中为 stdout 分配缓冲区。