malloc是如何分配内存的,堆的大小是多少
How malloc allocates memory and what is the size of Heap?
我不理解下面显示的程序。
#include<stdio.h>
#include<sys/types.h>
#include<malloc.h>
main()
{
int *i1, *i2;
char *s;
printf("sbrk(0) before malloc(4): 0x%xn", sbrk(0));
i1 = (int *) malloc(4);
printf("sbrk(0) after `i1 = (int *) malloc(4)': 0x%xn", sbrk(0));
i2 = (int *) malloc(4);
printf("sbrk(0) after `i2 = (int *) malloc(4)': 0x%xn", sbrk(0));
printf("i1 = %p, i2 = %pn", i1, i2);
}
Output:
mohanraj@ltsp63:~/Development/chap8$ ./a.out
sbrk(0) before malloc(4): 0x8999000
sbrk(0) after `i1 = (int *) malloc(4)': 0x89ba000
sbrk(0) after `i2 = (int *) malloc(4)': 0x89ba000
i1 = 0x8999008, i2 = 0x8999018
mohanraj@ltsp63:~/Development/chap8$
上面的输出显示,第一次,程序中断为0x899000。一旦调用malloc,程序中断就是更改为0x89ba000。
我不清楚的是:
malloc有什么用。根据引用,malloc用于在堆中分配内存。在程序在执行中,堆内存的大小是多少?那时堆是否有内存。根据输出,如果堆已经有了内存,那么为什么程序中断被更改了。malloc自动分配请求的大小堆中的内存。
根据上面的输出,一旦malloc被调用,程序中断就会被更改。在malloc调用的第二次之后,程序中断没有改变。因此,它表明在程序执行的初始阶段,堆不会包含内存。一旦malloc被调用,那么使用sbrk函数只分配堆内存。对吗?
当您调用malloc时,堆会自动增长。由于sbrk调用代价高昂,系统内存管理器会分配大块的系统内存,然后将较小的内存分配给应用程序。当堆增长超过128k时,你只分配了4个字节。试着分配远远超过4个字节,比如1MB,看看会发生什么。
相关文章:
- 必须为 C++20 协程帧保留多少内存?
- 堆栈上的参考用途有多少内存
- 指针数组中将有多少内存分配
- 一个 Excel XLL 插件可以有多少内存?
- 在C 中存储对对象的引用需要多少内存
- 对象指针如何知道要删除多少内存
- 使用犰狳线性代数包存储矩阵需要多少内存
- std::vector-他将分配多少内存(在重新分配期间)
- 一个C++指针使用多少内存
- x64 进程可以在 4GB RAM 上占用多少内存
- 计算出一个程序(规划中)需要多少内存
- C/C++ 程序正在使用多少内存
- 哪些数据结构正在使用多少内存
- 表示一个地址需要多少内存
- 了解我有多少内存可用于一个动态向量c++
- 我怎么能看到我的程序消耗了多少内存
- 在x64中,我们可以通过malloc()获得多少内存
- 是否有一种方法可以测量特定函数从堆栈中消耗了多少内存?
- 在c++中,枚举数据类型消耗多少内存
- 对象消耗了多少内存