我是 C 的新手,我对分配器在 C 中可以做什么感到困惑。
正如标题所问,如果需要,分配器可以使用未初始化的数据段来满足堆请求吗?
术语“内存分配器”在定义 C 语言的标准中没有任何意义。但是,它们确实定义了 C 运行时库必须提供的一组“内存管理功能”,因此我假设您要询问的是这些功能。
这些标准也没有定义从哪里甚至如何分配内存,只是函数malloc
,calloc
和必须存在并且具有指定的语义realloc
。free
因此,由实现决定从哪里分配内存。
术语“未初始化的数据段”通常是指已编译的可执行文件的一部分,它指定加载程序应保留一定数量的内存供程序使用。
在我知道的所有实现中(或者至少是那些术语“未初始化的数据段”有意义的实现),该部分用于未初始化的静态变量。
在大多数实现中,C 运行时将通过调用 OS 内核以获取内存块来形成堆,然后将其分配给程序。
这里有一个关于 Linux 中进程内存布局的很好的描述。