简明分析C/C++内存分配的解决方案

C/C++的内存分配(通过malloc或new)可能需要花费很多时。

更糟糕的是,随 着时间的流逝,内存(memory)将形成碎片,所以一个应用程序的运行会越来越慢。当它 运行了很长时间和/或执行了很多的内存分配(释放)操作的时候。特别是,你经常申请 很小的一块内存,堆(heap)会变成碎片的。

解决方案:你自己的内存池一个( 可能的)解决方法是内存池(Memory Pool)。

在启动的时候,一个“内存 池”(Memory Pool)分配一块很大的内存,并将会将这个大块(block)分成较小 的块(smaller chunks)。每次你从内存池申请内存空间时,它会从先前已经分配的块( chunks)中得到,而不是从操作系统。最大的优势在于:

1:非常少(几没有) 堆碎片

2: 比通常的内存申请/释放(比如通过malloc, new等)的方式快另外, 你可以得到以下好处:1:检查任何一个指针是否在内存池里2:写一个“堆转储 (Heap-Dump)”到你的硬盘(对事后的调试非常有用)

3: 某种“内 存泄漏检测(memory-leak detection)”:当你没有释放所有以前分配的内存时, 内存池(Memory Pool)会抛出一个断言(assertion)。

SMemoryChunk.h

#ifndef __SMEMORYCHUNK_H__
#define __SMEMORYCHUNK_H__
typedef unsigned char TByte ;
struct SMemoryChunk
{
 TByte *Data;         //数据
  std::size_t DataSize;    //该内存块的总大小
 std::size_t UsedSize;     //实际使用的大小
 bool IsAllocationChunk;
 SMemoryChunk *Next;     //指向链表中下一个块的指针。
};
#endif

IMemoryBlock.h

#ifndef __IMEMORYBLOCK_H__
#define __IMEMORYBLOCK_H__
class IMemoryBlock
{
 public :
  virtual ~IMemoryBlock() {};
  virtual void *GetMemory(const std::size_t &sMemorySize) = 0;
  virtual void FreeMemory(void *ptrMemoryBlock, const std::size_t &sMemoryBlockSize) = 0;
};
#endif

时间: 2024-09-19 23:50:49

简明分析C/C++内存分配的解决方案的相关文章

详细分析 javascript 的内存分配

JavaScript语言是一门优秀的脚本语言.其中包含脚本语言的灵活性外还拥有许多高级语言的特性.例如充许构建和实例化一个对象,垃圾回 收机制(GC:Garbage Collecation).通常我们使用new创建对象,GC负责回收对象占用内存区域.因此了解GC,可以加深对JavaScript垃圾回收 机制的理解. 1.用局部变量和全局变量解释GC GC在回收内存时,首先会判断该对象是否被其它对象引用.在确定没有其它对象引用便释放该对象内存区域.因此如何确定对象不再被引用是 GC的关键所在. 1

对象池加速游戏内存分配的解决方案

相比内存池,对象池更易用更容易管理,而且还可以利用脏数据,也就是上次被回收掉的对象的数据.而且偶尔的空间分配失败其实不是那么重要(后面会讲怎么在会失败的情况下完成分配任务),游戏中还是速度更重要些. 原理 一次申请大量连续内存(整数个对象大小),最好用堆,当然如果用栈数组也没人拦你,栈空间可是相当有限- 由于分配的对象生存期是不固定的(如下图),池不可能保持已分配对象的连续性,这时进行块移动会降低程序效率.   分配       分配 分配   分配   所以需要把闲置对象的指针放入容器中来管理

浅析值类型与引用类型的内存分配

大家都知道要学好 .NET,深入了解值类型和引用类型是必不可少的.在这里我给大家简单分析一下它们内存分配的区别和联系. 在分析之前,我们先行构造出一个最简单的类引用类型: public class MyClass { } 局部变量的声明 在我们使用类型时,代码里面必然少不了变量的声明,我们先看一下方法内的局部变量的声明,请看如下代码: private static void Main() { int i; MyClass mc; i = 5; mc = new MyClass(); } 当一个局

源码分析:Java对象的内存分配

Java对象的分配,根据其过程,将其分为快速分配和慢速分配两种形式,其中快速分配使用无锁的指针碰撞技术在新生代的Eden区上进行分配,而慢速分配根据堆的实现方式.GC的实现方式.代的实现方式不同而具有不同的分配调用层次.  下面就以bytecodeInterpreter解释器对于new指令的解释出发,分析实例对象的内存分配过程: 一.快速分配 1.实例的创建首先需要知道该类型是否被加载和正确解析,根据字节码所指定的CONSTANT_Class_info常量池索引,获取对象的类型信息并调 用is_

MySQL · 源码分析 · 内存分配机制

前言 内存资源由操作系统管理,分配与回收操作可能会执行系统调用(以 malloc 算法为例,较大的内存空间分配接口是 mmap, 而较小的空间 free 之后并不归还给操作系统 ),频繁的系统调用必然会降低系统性能,但是可以最大限度的把使用完毕的内存让给其它进程使用,相反长时间占有内存资源可以减少系统调用次数,但是内存资源不足会导致操作系统频繁换页,降低服务器的整体性能. 数据库是使用内存的"大户",合理的内存分配机制就尤为重要,上一期月报介绍了 PostgreSQL 的内存上下文,本

java 字符串内存分配的分析与总结(推荐)_java

经常在网上各大版块都能看到对于java字符串运行时内存分配的探讨,形如:String a = "123",String b = new String("123"),这两种形式的字符串是存放在什么地方的呢,其实这两种形式的字符串字面值"123"本身在运行时既不是存放在栈上,也不是存放在堆上,他们是存放在方法区中的某个常量区,并且对于相同的字符串字面值在内存中只保留一份.下面我们将以实例来分析. 1.==运算符作用在两个字符串引用比较的两个案例: p

Linux转发瓶颈分析、评估、优化与解决方案

线速概念 很多人对这个线速概念存在误解.认为所谓线速能力就是路由器/交换机就像一根网线一样.而这,是不可能的.应该考虑到的一个概念就是延迟.数据包进入路由器或者交换机,存在一个核心延迟操作,这就是选路,对于路由器而言,就是路由查找,对于交换机而言,就是查询MAC/端口映射表,这个延迟是无法避开的,这个操作需要大量的计算机资源,所以不管是路由器还是交换机,数据包在内部是不可能像在线缆上那样近光速传输的.类比一下你经过十字街头的时候,是不是要左顾右盼呢?        那么,设备的线速能力怎么衡量呢

位图引起的内存溢出OutOfMemory解决方案

位图引起的内存溢出OutOfMemory解决方案 作者:老帅 一.问题描述:Android下的相机在独自使用时,拍照没有问题,通过我们的代码调用时,也正常,但是更换了不同厂商的平板,ROM由Android4.0变成了Android4.1后,拍照出现了OutOfMemory异常,程序中断退出.如何解决这个问题呢? 二.先看看我们之前所写的代码 1) 调用系统相机(没有怀疑这里出错,代码略) 2)显示图片 mImageView = (ImageView) findViewById(R.id.imag

c++有没有内存分配查看工具啊

问题描述 c++有没有内存分配查看工具啊 有没有一个工具可以查看c++对象内存分配情况呢?至少可以得到有哪些对象,分别是分配在堆上还是栈上等信息? 解决方案 根本不用看,我说了,这是固定的.局部变量在堆栈上,动态分配的在堆上. 解决方案二: 有内存泄露检测工具...... 解决方案三: 主要是从语法上来理解,直接查看的工具没有,一般也就是nm readelf等分析.