C/C++内存分配方式总结——来自《高质量编程指南》

来源:互联网 发布:fx168外汇数据 编辑:程序博客网 时间:2024/05/16 07:56

         C/C++内存分配方式有3种:

        (1)从静态存储区域分配。内存在程序编译的时候就已经分配好了(即已经编址),这些内存在程序的整个运行都存在。例如全局变量,static变量等。

         (2)在堆栈上分配。在函数执行期间函数内局部变量(包括形参)的存储单元都创建在堆栈上,函数结束时这些存储单元自动释放(堆栈清退)。堆栈内存分配运算内置于处理器的指令集中,效率很高,并且一般不存在失败的经验,但是分配的内存容量有限,可能出现堆栈溢出。

        (3)从堆或自由存储空间上分配,亦称动态内存分配。程序在运行期间用malloc()或new申请任意数量的内存,程序员自己掌握释放内存的恰当时机(使用free()或delete)。动态内存的生命周期由程序员决定,使用非常灵活,但也最容易产生问题。


          一般的原则是:如果使用堆栈存储和静态存储就能满足应用要求,那么就不要使用动态存储。这是因为,在堆上动态分配内存需要很可观的额外开销:

          1. 应用程序将调用操作系统中内存管理模块的堆管理器,搜索其中是否有符合要求的空闲的连续字节内存块。特别是在经过多次动态分配后,堆会变得“千苍百孔”——出现大量的闲散内存碎片,此时可能需要首先进行碎片合并,然后才能分配成功,在这种情况下动态分配需要很长时间。

          2. 如果动态分配失败,需要检查返回值或者捕获异常,这也需要额外开销。

          3. 动态创建的对象可能被删除多次,甚至在删除后还会继续使用,或者根本就不会被删除,于是出现运行时错误或程序“吃”内存的现象。

原创粉丝点击