用户态的内存分配
下面对用户态的内存分配函数进行一个总结。
/* 分配SIZE字节的内存 */
/* Allocate SIZE bytes of memory. */
void *malloc(size_t size);
/* 分配NMEMB个元素,每个元素SIZE字节的内存,并全部初始化为0 */
/* Allocate NMEMB elements of SIZE bytes each, all initialized to 0. */
void *calloc (size_t __nmemb, size_t __size);
/* 将之前分配的PTR指针从新分配,使新的块为SIZE字节 */
/* Re-allocate the previously allocated block in PTR, making the new block SIZE bytes long. */
void *realloc (void *__ptr, size_t __size);
/* 释放由上述三个函数分配的内存块 */
/* Free a block allocated by `malloc', `realloc' or `calloc'. */
void free(void *ptr);
其实在<malloc.h>中还有一个cfree函数,可以用来释放calloc分配的内存,man手册中写的是支持的平台不同,我们使用的时候就统一用free就好啦。
除了上述几个常用的分配函数以外,还有一些函数可以进行内存对齐并分配。
/* 按ALIGNMENT对齐,来分配SIZE字节 */
/* Allocate SIZE bytes allocated to ALIGNMENT bytes. */
void *memalign (size_t __alignment, size_t __size);
/* 已弃用,等同于valloc, 不过会把结果四舍五入到最近似的页面大小 */
/* Equivalent to valloc(minimum-page-that-holds(n)), that is, round up _size to nearest pagesize. */
void *pvalloc (size_t __size);
/* 已弃用,在页的边界分配SIZE字节的内存,大小需是页大小的倍数,相当于按页对齐,该内存不能被释放 */
/* Allocate SIZE bytes on a page boundary. The storage cannot be freed. */
void *valloc (size_t __size);
/* 分配SIZE字节的内存,并按ALIGNMENT进行对齐 */
/* Allocate memory of SIZE bytes with an alignment of ALIGNMENT. */
int posix_memalign (void **__memptr, size_t __alignment, size_t __size);
/* ISO C版本的对齐分配 */
/* ISO C variant of aligned allocation. */
void *aligned_alloc (size_t __alignment, size_t __size);
//The functions memalign(), valloc(), and pvalloc() have been available in all Linux libc libraries.
//The function aligned_alloc() was added to glibc in version 2.16.
//The function posix_memalign() is available since glibc 2.1.91.
由于malloc/calloc/realloc都是默认8字节对齐分配的,所以如果需要更大字节对齐的场合,就需要调用这些函数。这些成功分配的内存在释放的时候也需要通过free函数。
其中pvalloc,valloc已经被弃用,猜测可能是不可被释放的原因吧。
那么问题来了,什么场景下需要大字节对齐呢?
这是个遗留问题,等遇到需求场景的时候进行补充,或者有看到这篇文章的同学可以提醒一下。
内核态的内存分配
//获得页
struct page *alloc_pages(gfp_t gfp_mask, unsigned int order);
//释放页
void free_pages(unsigned long addr, unsigned int order);
//按字节获取内核内存,该内存在物理内存上是连续的
void *kmalloc(size_t size, gfp_t flags);
void kfree(const void *);
//按字节获取内核内存,该内存只在虚拟内存上是连续的
//主要用于获取大块内存
void *vmalloc(unsigned long size);
void vfree(const void *addr);
本文总结了C语言中用户态的内存分配,包括malloc、calloc、realloc及其内存对齐的特殊函数。虽然cfree已被弃用,通常推荐使用free释放内存。文章提及大字节对齐的适用场景尚未详细展开,期待应用场景的讨论。
7万+

被折叠的 条评论
为什么被折叠?



