gpt4 book ai didi

c - 书中的内存分配练习称为 "Expert C programming"

转载 作者:太空狗 更新时间:2023-10-29 15:22:00 27 4
gpt4 key购买 nike

这个练习让我看看如果接下来的程序中分配的内存块小于 1MB 会发生什么:

#include <stdio.h>
#include <stdlib.h>
main()
{
int MB=0;
while(malloc(1<<20))
++MB;
printf("Allocated %d MB total\n",MB);
}

我笔记本上的结果是

Allocated 3056 MB total

比起我这样修改程序:

#include <stdio.h>
#include <stdlib.h>
main()
{
int MB=0;
while(malloc(1<<19))
++MB;
printf("Allocated %d MB total\n",MB/2+MB%2);
}

结果是

Allocated 3045 MB total

我自己改的程序对吗?为什么结果小于 3056MB?

最佳答案

  1. 是的,你的程序没问题。 (尽管总是将兆字节数四舍五入有点不标准。)

  2. 当您调用 free 时,您不会告诉它您要释放的 block 有多大。这意味着内存管理系统必须知道每个 block 有多大。这意味着它必须将该信息存储在某个地方。由于它不能将信息存储在内存块内,因此必须将其存储在 block 外,这通常意味着实际分配的内存比请求的多一些。例如,它实际上可以分配一个比请求的 block 大 size_t 的 block ,将 block 大小存储在开头,然后告诉您该 block 在大小之后开始.

大多数 malloc 实现都会在页面边界上进行大量分配(通常一个页面是 4K)。一种方法是为每次分配浪费整个页面,仅将页面用于单个 size_t 值。这看起来很糟糕,但如果你要求即使是半兆字节,一个页面也不到分配大小的 1%,而浪费总内存的 1% 并不是那么糟糕。

假设您的 malloc 这样做了。当您分配 1MB 的 block 时,您设法分配了其中的 3056 个。如果每个分配比请求大一个 4k 页面,则隐藏分配将为 3056*4k,或略小于 12 兆字节。 (实际上它略小于 12 mebibytes ,但是当我指的是 mebi 时,我将继续说 mega。)所以可用的总内存应该是 3068 MB。

当您将其更改为分配 ½MB block 时,您设法分配了至少 3045*2 - 1 个(假设 MB 数向上舍入)。那是 6089 个额外页面,大约 23.8 MB,加上分配的 3044.5 MB,总共大约 3068.3 MB。

这些都不能证明您的 malloc 以这种方式工作,但它至少显示了一种可能的机制。

关于c - 书中的内存分配练习称为 "Expert C programming",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24051827/

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