内存处理函数 内存池

内存处理函数

内存申请函数(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. 减少内存碎片化:内存池可以根据程序的实际需求来管理内存资源,避免内存碎片化问题。通过内存池,可以有效地管理和利用内存资源,提高内存的利用率。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/686638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

同步缓冲器设计(Synchronous FIFO)

缓冲器又称为队列&#xff0c;是一种数据暂存的机制。缓冲器存在的必要是因为当数据传出端传出数据时&#xff0c;接收端不一定能实时地接收&#xff0c;如果接收端不能实时地接收&#xff0c;又无缓冲器的存在&#xff0c;数据将不可避免会遗失。如果输出输入端的时钟频率一致…

2024.2.15 模拟实现 RabbitMQ —— 消息持久化

目录 引言 约定存储方式 消息序列化 重点理解 针对 MessageFileManager 单元测试 小结 统一硬盘操作​​​​​​​ 引言 问题&#xff1a; 关于 Message&#xff08;消息&#xff09;为啥在硬盘上存储&#xff1f; 回答&#xff1a; 消息操作并不涉及到复杂的增删查改消…

人工智能学习与实训笔记(十四):Langchain之Agent

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 0、概要 1、Agent整体架构 2、langchain中agent实现 3、Agent业务实现逻辑 0、概要 Agent是干什么的&#xff1f; Agent的核心思想是使用语言模型&#xff08;LLM&#xff09;作为推理的大脑…

redis为什么使用跳跃表而不是树

Redis中支持五种数据类型中有序集合Sorted Set的底层数据结构使用的跳跃表&#xff0c;为何不使用其他的如平衡二叉树、b树等数据结构呢&#xff1f; 1&#xff0c;redis的设计目标、性能需求&#xff1a; redis是高性能的非关系型&#xff08;NoSQL&#xff09;内存键值数据…

SpringBoot中公共字段的自动填充

目录 1 前言 2 使用方法 2.1 自定义枚举类 2.2 自定义注解AutoFill 2.3 自定义切面类并设定切入点 2.4 切面类中设置前置通知&#xff0c;对公共字段赋值 2.5 在方法上添加自定义注解 3 最后 1 前言 在我们的项目中&#xff0c;项目表可能会有一些公共的字段需要我们的…

【51单片机实验笔记】开关篇(二) 矩阵按键

目录 前言原理图分析矩阵按键扫描算法 软件实现1. 矩阵键盘检测2. 简易计算器实现 总结 前言 本节内容&#xff0c;我们学习一下矩阵按键&#xff0c;它是独立按键的阵列形式&#xff0c;常见的应用即键盘。 本节涉及到的封装源文件可在《模块功能封装汇总》中找到。 本节完…

websocket数据帧格式

客户端、服务端数据的交换&#xff0c;离不开数据帧格式的定义。因此&#xff0c;在实际讲解数据交换之前&#xff0c;我们先来看下WebSocket的数据帧格式。 WebSocket客户端、服务端通信的最小单位是帧&#xff08;frame&#xff09;&#xff0c;由1个或多个帧组成一条完整的消…

基于协同过滤的时尚穿搭推荐系统

项目&#xff1a;基于协同过滤的时尚穿搭推荐系统 摘 要 基于协同过滤的时尚穿搭推荐系统是一种能自动从网络上收集信息的工具&#xff0c;可根据用户的需求定向采集特定数据信息的工具&#xff0c;本项目通过研究服饰流行的分析和预测的分析和预测信息可视化时尚穿搭推荐系统…

2月12作业

1.会出现段错误&#xff0c;因为p申请的堆区内存未返回给str&#xff0c;导致str仍然指向NULL&#xff0c;无法将"hello world"拷贝给str 2.会出现段错误&#xff0c;因为p是一个局部变量&#xff0c;函数结束时&#xff0c;p将被释放&#xff0c;不能返回它的地址 …

C++中的volatile:穿越编译器的屏障

C中的volatile&#xff1a;穿越编译器的屏障 在C编程中&#xff0c;我们经常会遇到需要与硬件交互或多线程环境下访问共享数据的情况。为了确保程序的正确性和可预测性&#xff0c;C提供了关键字volatile来修饰变量。本文将深入解析C中的volatile关键字&#xff0c;介绍其作用、…

浅谈电商场景中的扣除库存问题

库存 一、场景二、扣减时机1.下单时扣库存2.支付完成扣库存3.预扣除 三、库存存储方案1.数据库存储2.数据库缓存混合存储 四、整体方案1.单数据库方案2.主从数据库方案3.主从数据库缓存方案4.数据库缓存混合存储 五、其他情况1.秒杀QPS过高2.Redis QPS过高3.Master DB QPS过高4…

使用ShardingJDBC实现分库分表

一、测试环境 JDK&#xff1a;1.8SpringBoot&#xff1a;2.7.17MySQL驱动&#xff1a;5.1.49MyBatis&#xff1a;2.3.1shardingJDBC&#xff1a;5.1.0 二、核心依赖 <!-- mysql 驱动 --> <dependency><groupId>mysql</groupId><artifactId>mysq…

网站架构演变、LNP+Mariadb数据库分离、Web服务器集群、Keepalived高可用

目录 day02 深入理解程序的数据存储 验证 配置NFS服务器 配置代理服务器 配置名称解析 day02 深入理解程序的数据存储 程序将文字数据保存到数据库中程序将非文字数据&#xff08;如图片、视频、压缩包等&#xff09;保存到相应的文件目录中 验证 发一篇文章&#xf…

Manifest merger failed with multiple errors, see logs

问题 Manifest merger failed with multiple errors, see logs详细问题 笔者进行Android 项目开发&#xff0c;修改AndroidManifest.xml代码后&#xff0c;控制台报错 AndroidManifest.xml报错核心代码 <manifest><uses-permission android:name"android.perm…

StringBuilder/StringBuffer类(Java)

StringBuilder/StringBuffer类 当对字符串进行修改的时候&#xff0c;使用 StringBuffer / StringBuilder 类更方便。和 String 类不同的是&#xff0c;StringBuffer 和 StringBuilder 类的对象能够被多次的修改&#xff0c;并且不产生新的未使用对象。方法类似 public class…

力扣:300. 最长递增子序列

动态规划: 1. 先定义dp数组来表示在下标为i时最长递增子序列&#xff0c;先初始化一下每个下标的值为dp【i】1。同时我们要判断在下标i之前的最长的递增子序列为多少&#xff0c;在判断当前的下标i是否满足递增的条件满足的话就进行dp【i】的重新赋值。之后要更新接受的最长递…

【C语言】长篇详解,字符系列篇1-----“混杂”的各种字符类型字符转换和strlen的模拟实现【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本期系列为【C语言】长篇详解&#xff0c;字符系列篇1-----“混杂”的各种字符函数……&#xff0c;图文讲解各种字符函数&#xff0c;带大家更深刻理解C语言中各种字符函数的应用&#xff0c;感谢观看&#xff0c;支持的可以给个赞哇。 前言…

内存块与内存池

&#xff08;1&#xff09;在运行过程中&#xff0c;MemoryPool内存池可能会有多个用来满足内存申请请求的内存块&#xff0c;这些内存块是从进程堆中开辟的一个较大的连续内存区域&#xff0c;它由一个MemoryBlock结构体和多个可供分配的内存单元组成&#xff0c;所有内存块组…

Java学习笔记------static

static 创建Javabean类 public class student {private int age;private String name;private String gender;public student() {}public student(int age, String name, String gender) {this.age age;this.name name;this.gender gender;}/*** 获取* return age*/public…

MySQL的索引类型

目录 1. 主键索引 (PRIMARY KEY) 2. 唯一索引 (UNIQUE) 3. 普通索引 (INDEX) 4. 全文索引 (FULLTEXT) 5. 空间索引 (SPATIAL) 6. 组合索引 (COMPOSITE INDEX) 7. 前缀索引 (PREFIX INDEX) 8. 覆盖索引 (COVERING INDEX) 1. 主键索引 (PRIMARY KEY) 描述&#xff1a;表…