内存处理函数 内存池

内存处理函数

内存申请函数(stdlib.h)

  • malloc
    原形:void *malloc(size_t size);
    功能:用于动态分配指定大小的内存块,分配的内存块不会被初始化,内容是未定义的。
    返回值:若分配成功,返回一个指向该内存块起始地址的通用型(void)指针(在C++中必须进行强制类型转换)。若分配失败,返回空指针。

  • calloc
    原形:void *calloc(size_t num, size_t size);
    功能:动态分配数量为 num ,每一块大小为 size 的连续内存块,并将其内容初始化为0。
    返回值:若分配成功,返回一个指向该内存块起始地址的通用型(void)指针(在C++中必须进行强制类型转换)。若分配失败,返回空指针。

  • realloc
    原形:void *realloc(void *ptr, size_t size);
    功能:重新分配之前分配的内存块的大小。
    扩大内存块:扩容后的新空间的内容是未定义的。

    • 若原内存块之后的内存空间足够大,则在原内存块之后进行扩展,不需要分配新的内存块,叫就地扩展。
    • 若原内存块之后的内存空间不足以扩展,则在内存中新的位置上重新分配一块能够容纳扩容后的内存空间,并将原内存块中的数据复制到新的内存空间中。继续访问原内存块会造成为定义行为(原内存块可能会被释放,或者继续被保留直到某个时机释放(延迟释放),具体实现取决于编译器)。

    缩小内存块:直接在原内存块上进行缩小,叫就地缩小。被缩小的部分为未定义行为(可能会被释放,也可能等待某个时机释放(延迟释放),具体实现取决于编译器)。
    返回值:若重新分配成功,返回一个指向该内存块起始地址的通用型(void)指针(在C++中必须进行强制类型转换)。若重新分配失败,返回空指针。

内存赋值函数(string.h)

  • memset
    原型:void memset(void s, int c, size_t n);
    功能:作用于指定内存区域 s 的前 n 个字节,按字节将 s 设置为指定的值 c。
    返回值:返回指向内存区域的指针。
    注:仅适用于大小为1B的存储单元的赋为任意值(如char型变量(传地址!)**及其数组),或其他大小的存储单元的赋值为0或-1(如int型变量及其数组),否则会无法产生预期结果。

内存块比较函数(string.h)

  • memcmp
    原型:int memcmp(const void *ptr1, const void *ptr2, size_t num);
    功能:作用域两个内存区域的前 num 个字节,按字节比较。
    返回值:在前num个字节中:若 ptr1都< ptr2 ,则返回一个负整数;若ptr1 都> ptr2 ,则返回一个正整数;若 ptr1 与ptr2 中有任意一个字节不相等,则返回 0。

内存复制函数(string.h)

  • memcpy
    原形:void *memcpy(void *dest, const void *src, size_t n);
    功能:作用于源内存区域src的前n个字节,按字节复制到目标内存区域dest。仅适用于目标内存区域和源内存区域无重叠的情况。若有重叠,则可能导致数据被覆盖或损坏。
    返回值:返回目标内存区域的起始地址
  • mempcpy
    原形:void *mempcpy(void *dest, const void *src, size_t n);
    功能:与memcpy相同,但返回值不同。
    返回值:返回目标内存区域的末尾指针
  • memmove
    原形:void *memmove(void *dest, const void *src, size_t n);
    功能:与memcpy相同,但也适用于目标内存区域和源内存区域相互重叠的情况。memmove 会先判断源内存区域与目标内存区域是否重叠,若有重叠,则会以一种安全的方式进行复制,从而避免数据被损坏。
    返回值:返回目标内存区域的起始地址

内存释放函数(stdlib.h)

  • free
    原形:void free(void *ptr);
    功能:释放之前动态申请分配的内存块(必须是动态申请的,不可以用free释放静态申请的内存),释放后原内存块不再有效,继续访问会导致未定义行为。程序结束后动态申请的内存是否被操作系统释放,取决于操作系统内存管理机制的实现。若动态申请的内存块未通过free释放,且操作系统的内存管理机制无法释放,则造成内存泄露。

从内存池的角度理解动态申请内存可以帮助我们更好地管理内存资源,提高内存的利用率和性能。内存池是一种预先分配一定数量内存块的技术,用于存储和管理动态申请的内存。通过内存池,我们可以避免频繁地调用系统的内存分配函数(如 malloc()free()),从而减少内存碎片化、提高内存分配和释放的效率。

从内存池角度看动态分配内存

从内存池的角度理解动态申请内存,可以分为以下几个方面:

  1. 预分配内存块:内存池会预先分配一定数量的内存块,并将它们保存在一个数据结构中(如数组、链表等)。这些内存块可以是固定大小的,也可以是不同大小的,根据具体需求而定。

  2. 动态分配和释放:当程序需要动态申请内存时,可以从内存池中获取一个空闲的内存块,并标记为已使用。当内存不再需要时,可以将内存块标记为未使用,以便后续重复利用。

  3. 减少系统调用:通过内存池,可以减少频繁地调用系统的内存分配函数,从而减少系统调用的开销,提高程序的性能。内存池会一次性地向系统申请一定数量的内存,然后在程序运行过程中重复利用这些内存块。

  4. 减少内存碎片化:内存池可以根据程序的实际需求来管理内存资源,避免内存碎片化问题。通过内存池,可以有效地管理和利用内存资源,提高内存的利用率。

总之,从内存池的角度理解动态申请内存可以帮助我们更好地管理和利用内存资源,提高程序的性能和稳定性。通过合理设计和使用内存池,可以有效地管理内存资源,降低内存分配和释放的开销,提高程序的效率。

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值