C++内存分配的几种策略

内存分配的几种策略

静态的

静态的存储区:内存在程序编译的时候就已经分配好,这块的内存在程序整个运行期间都一直存在。它主要存放静态数据、全局的static数据和一些常量。

栈式的

在执行函数(方法)时,函数一些内部变量的存储都可以放在栈上面创建,函数执行结束的时候这些存储单元就会自动被释放掉。栈内存包括分配的运算速度很快,因为内置在处理器的里面的。当然容量有限。

堆式的

也叫做动态内存分配。有时候可以用malloc或者new来申请分配一个内存。在C/C++可能需要自己负责释放(java里面直接依赖GC机制)。在C/C++这里是可以自己掌控内存的,需要有很高的素养来解决内存的问题。java在这一块貌似程序员没有很好的方法自己去解决垃圾内存,需要的是编程的时候就要注意自己良好的编程习惯。

区别

  1. 堆是不连续的内存区域,堆空间比较灵活也特别大。堆管理很麻烦,频繁地new/free会造成大量的内存碎片,这样就会慢慢导致效率低下。
  2. 栈是一块连续的内存区域,大小是有操作系统觉决定的。栈先进后出,进出完全不会产生碎片,运行效率高且稳定。
C++内存分配主要涉及动态内存管理和堆(heap)内存管理。内存分配算法包括以下几种: 1. **首次适应(First-Fit)**:这是最简单的内存分配策略,从内存空间的起始地址开始搜索,找到第一个足够大的空闲块来分配。如果所有块都小于请求的大小,则可能会导致内存碎片。 2. **最佳适应(Best-Fit)**:此策略寻找最适合当前请求大小的空闲块,即使这可能会使剩余的空间变得不连续。它更倾向于高效地使用内存,但可能会浪费一些小块。 3. **最差适应(Worst-Fit)**:与最佳适应相反,最差适应选择的是最不适合请求大小的空闲块,这样可能会导致大量的内存碎片。 4. **最小剩余适配(Next-Fit)**:类似于首次适应,但它每次分配后都会释放当前块后面的空闲区域,以便下次能分配到更小的块。 5. ** Buddy System(友元系统)**:这是一种用于内存管理的特殊技术,主要用于嵌入式系统和实时系统。它将大内存块分割成相同大小的小块,便于快速分配和回收。 6. **内存池(Memory Pool)**:预先为常见大小的内存分配创建预分配的内存池,加快了分配速度,减少了内存碎片。 7. ** slab allocator**:一种高效的内存分配器,用于管理小对象。它将内存分为若干个大小固定的slab,每个slab内的对象大小相同,减少了内存碎片。 这些算法中,现代操作系统和库(如C++标准库中的`new`和`delete`操作符)通常采用更复杂的混合策略,例如分代垃圾收集、内存池等,来提高性能和内存利用率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值