gpt4 book ai didi

c - 分配内存的地址取决于什么?

转载 作者:太空狗 更新时间:2023-10-29 15:32:52 26 4
gpt4 key购买 nike

查看这两个 C 代码:

char* char_pointer;
int* int_pointer;

char_pointer = (char*)malloc(5);
printf("location of char_pointer: %p\n", char_pointer);

int_pointer = (int*)malloc(10);
printf("location of int_pointer: %p\n", int_pointer);

free(char_pointer);

char_pointer = (char*)malloc(50);
printf("location of char_pointer: %p\n", char_pointer);

char* char_pointer;
int* int_pointer;

char_pointer = (char*)malloc(200);
printf("location of char_pointer: %p\n", char_pointer);

int_pointer = (int*)malloc(10);
printf("location of int_pointer: %p\n", int_pointer);

free(char_pointer);

char_pointer = (char*)malloc(50);
printf("location of char_pointer: %p\n", char_pointer);

输出是:

location of char_pointer: 0x23eb010
location of int_pointer: 0x23eb030
location of char_pointer: 0x23eb050

location of char_pointer: 0x1815010
location of int_pointer: 0x18150e0
location of char_pointer: 0x1815010

如您所见,在第一个程序中,它决定在 int_pointer 之后分配 char_pointer(在我释放和重新分配之后),但在第二个程序中它决定分配 char_pointer 代替释放的内存 0x1815010

程序之间的唯一区别是分配和释放的内存量。

所以,我的问题是:

分配名额的决定取决于什么? (操作系统、编译器或硬件)

如果分配的内存量“很大”,为什么“它”会决定分配而不是释放内存?

附言我已在 this book 中读到有关此问题的信息

最佳答案

这取决于很多因素,并且没有简单的描述来描述行为。每个 C 运行时库都实现了 malloc()不同的是——如果您对 CRT 的幕后工作方式感到好奇,您可以查看 CRT 的源代码。

下面是一些常用的malloc()实现:

大多数内存分配器的粗略工作方式是跟踪可用内存区域。当请求分配内存时,他们将查看是否有可用的内存区域至少与请求一样大,如果有,则分割该内存,更新其内部数据结构以反射(reflect)该内存现在是分配,并返回相应的指针。如果没有足够的可用内存,分配器将向操作系统请求更多的虚拟内存地址空间(通常通过 sbrk(2) mmap(2) VirtualAlloc )。

因此,如果一个 block 被分配然后被释放,然后请求另一个相同大小(或更小)的请求,通常(但不总是),相同或相似的指针将作为第一个 block 返回。

如果请求的分配非常大,分配器可能决定跳过其内部 block 处理,而是直接从操作系统满足请求——当分配数百 KB 或更多时,直接 mmap() 通常更有效。或 VirtualAlloc()该内存,而不是尝试在内部空闲内存区域列表中查找空闲 block 。但并非所有分配器都这样做,而且确切的分界点通常是可变的。

关于c - 分配内存的地址取决于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20664386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com