C++内存管理——C++内存分类

原创 2007年09月30日 13:36:00

 C++内存管理——内存分类

MoaKap

    在编写程序过程中,程序员必须清楚程序内存的分配机制,合理进行内存管理,这样才能得到高效的程序。同时,如果对C++内存分配基本概念不理解,使用不当,一方面浪费了宝贵的内存资源,降低了程序运行效率,另一方面还会造成程序中意想不到的错误。

C++程序中,把内存分为4类,程序存储区、静态数据存储区、运行时栈、自由存储区或堆

1、  程序存储区

包含所有函数及成员函数的机器指令。函数一旦被编译,即被编译为特定得机器指令,存放在程序存储区。当程序运行时,从内从中读取并执行指令。

这部分内存不允许更改,在一般情况下,指针不会指向内存代码段中的位置。但也有特殊,如指向函数的指针,其指向即为程序存储区存放该函数的机器指令的位置。

2、  静态数据存储区

此段存放所有的全局变量,以及由static修饰符声明的任意局部变量、或类数据成员。

其中全局变量是指在函数或类作用域之外定义的变量,通过赋值或构造函数初始化。在main函数开始执行之前,完成对全局变量的初始化。

像全局变量一样,static定义的变量同样只需分配一次内存,而且要在main开始执行之前对其进行初始化,且每个名字只能分配一个值。之后该变量将一直存在直到运行结束。

3、  运行时栈

运行时栈是指程序运行时使用的栈,使用栈来保存程序运行过程中的一些系统指针。

例如,调用函数时存储参数和返回地址的指针。当要调用函数时,程序先将这返回地址指针压栈,然后程序跳转至调用函数执行,函数返回后从栈中弹出位置指针找到调用函数前的位置,以便继续执行接下来的指令。

运行时栈 还用来为函数中的参数、局部变量分配内存,待函数返回时从栈中释放内存,允许下一次函数调用重用该内存块。

运行时栈可以实现内存的重用,增加了内存使用效率,但使用栈存储局部变量有两个主要缺点:

A、 栈内存值的生存期取决于函数的开始和结束。即函数返回时,栈中的值就不存在了。因此,任何返回局部变量地址的操作都是不允许的。

B、 栈为局部变量分配内存时,必须已知变量要占用的内存空间的大小。

4、  自由存储区或堆

在不能预知对象大小的情况下,就不能使用栈内存。例如在不知道数组包含的元素数的情况下,就不能使用栈未数组分配内存。

此时,就需要动态存储分配。

堆(自由存储区)存储由运算符new显式申请空间的大小。

例如:  在函数中有   Employee * boss = new Employee”Lin, Lisa”,68000;

上面的语句声明了存储在栈中的名为boss的指针变量。指针的值指向存储在堆中的数据域。 其中boss变量存放在栈空间中,指针指向的数据则存放在堆中。

参考: Big C++ 中文版

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

如何养成良好的 C++ 编程习惯(1)—— 内存管理

开篇导读   “养成良好的编程习惯”其实是相当综合的一个命题,可以从多个角度、维度和层次进行论述和评判。如代码的风格、效率和可读性;模块设计的灵活性、可扩展性和耦合度等等。要试图把所有方面都阐述...

C++内存管理——指针&&数组

C++/C程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。但二者有着本质的区别: 数组:要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指...

【转】linux编程之——C++内存管理详解

程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。 ...

C/C++ 笔试面试(3)——内存管理GetMemory 确实遇到的面试题

程序的局部变量存在于(栈)中 程序的全局变量存在于(静态存储区)中 程序动态申请的数据存在于(堆)中 [cpp] view plain copy ...

C++指针——(4)指针与动态内存管理

1.动态持久内存分配从一个程序运行开始,#include using namespace std;int* reverse(const int* list, int size) { int r...

《高质量C++/C编程指南》笔记——内存管理1-2

7.1 内存分配方式 内存分配方式有三种: (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 (2)在栈上创建。在...

《高质量C++/C编程指南》笔记——内存管理[3, 指针与数组的对比]

7.3 指针与数组的对比 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组明对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。 指针可以随时指向任意...

C/C++ 笔试面试(3)——内存管理GetMemory

1.关于动态申请内存的问题 出现率极高 程序的局部变量存在于(栈)中 程序的全局变量存在于(静态存储区)中 程序动态申请的数据存在于(堆)中 [...

栈帧的组织——C/C++内存管理必须掌握的

栈帧由下面几个元素组成: 返回地址:函数完成后要返回的程序内部地址 局部数据存储:为局部变量分配的内存 参数存储:为函数参数分配的内存 栈指针和基...

从java到C++——new和delete的动态内存管理

C++中定义了两个运算符来分配和释放内存:new分配内存,delete释放内存。   使用new来动态分配和初化对象 在自由空间分配的内存是无名的,因此new无法为其分配的对象命名,而是返回...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)