C语言alloc函数总结

本文总结了C语言中用户态的内存分配,包括malloc、calloc、realloc及其内存对齐的特殊函数。虽然cfree已被弃用,通常推荐使用free释放内存。文章提及大字节对齐的适用场景尚未详细展开,期待应用场景的讨论。

用户态的内存分配

下面对用户态的内存分配函数进行一个总结。

/* 分配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);

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值