内存区分配(栈区堆区全局区)C++

原创 2018年04月17日 18:45:47

1栈区(stack)

1)临时数据寄存交换区,存放局部变量和对象;
2)先进后出,向低地址生长。
3)空间大小1~2MB,超出会出现内存溢出错误,适用于占用空间定长且占用空间小的数据。不太适用于递归函数(a.函数没递归一次都会生成一个对象,每返回一次都会销毁一个对象,所以随递归调用深度增加,需要栈空间也会线性增加,可能造成栈溢出b.每个对象都局限于当前调用层,对于不管是对于更浅露的外层还是更深入的内层都是不可见的,因而每层都需要自己的局部对象和共享。因而此时使用静态(static)局部函数,不仅可以大大减小函数开销,还可以保存函数被调用时的中间态,被各层所访问)。
4)栈区内存配置和释放由编译器决定。
5)特点:a.自动生成自动销毁
b.空间小,速度快

int fun(int y){}
int mian(){
t=fun(x);
return 0;
}
//过程:
// 1 fun函数为值传递,因而x会调用赋值构造函数,产生一个临时对象,也就是y。
// 2 在函数返回时,y需要调用赋值构造函数,产生一个新的临时对象y1,同时栈对象y被释放。
// 3 y1调用赋值构造函数,产生新临时对象t,y1被释放。
// 4 t,x则在main函数返回后被释放。

//可以看到值传递过程中,编译器产生了较多临时对象以及需要进行相应的内存空间内配与释放,开销较大。
//因而在面对较大的对象的函数传参时以及返回时尽可能采用const引用传递与返回,避免内存反复申请与释放。

2堆区(heap)

1)动态分配内存区;大小不固定。
2)适用于内存数据长度不固定,内存占用较大的数据,如字符串,数组。
3)先进先出,满足堆性质的一种优先队列;向高地址生长。
4)堆区的内存配置和释放有程序员决定 。
5)特点:动态性;容量大。

 T*p=(T*)malloc(sizeof(T));
 T*p=new T();
 /*采用new时,需要delet释放内存以及p置为NULL。malloc则对应free
 1)不释放内存会造成内存泄漏;
 2)指针不置空会使p成为野指针,后续不当使用p将会造成程序奔溃。
 */

3全局区(静态static存储区 )

1)存储静态或全局对象。
2)特点
a,全局对象为类以及函数间通信提供了一种简单直接的方式。(但过多的使用全局对象会降低程序的健壮性,稳定性,可维护性以及可复用性)。
b静态局部变量可以代替栈对象保持递归函数被屡次调用时的中间态,减少函数是调用开销以及各层能共享访问。

int main(){
_main();//隐式代码,由编译器生成,构造静态或全局对象
...//显示代码
return 0;
}
/*在正式执行main函数的显示代码前,编译器会先自动生成一个_main()函数,
来构造和初始化所有静态全局或全局对象。
注1):静态局部变量在其所在函数贴被执行时,第一次分配内存与初始化,之后该静态局部变量不再执行初始化语句并一直存在到程序结束。
注2):类的静态局部变量伴随着该类的第一个实例化对象的产生而产生,之后被该类或继承自该类的所有对象所共享直到程序结束。

Pascal 精要--第一章

 www.marcocantu.com Marcos Delphi Books Essential Pascal - Web Site Essential Pascal - Local Index P...
  • daiqinfen
  • daiqinfen
  • 2001-12-29 09:55:00
  • 1039

详解栈区、堆区、全局区、文字常量区、程序代码区

一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(he...
  • yangle4695
  • yangle4695
  • 2016-08-08 17:06:25
  • 4648

栈区,堆区,全局区,文字常量区,程序代码区 内存详解

在C/C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数...
  • ws891033655
  • ws891033655
  • 2014-06-10 22:59:29
  • 1035

iOS程序中的内存分配 栈区 堆区 全局区(静态区) 常量区 方法区

iOS程序中的内存分配 栈区堆区全局区(转) 在计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同。 一、内存分区 栈区(stack) 由编译器自动分...
  • shi520fu
  • shi520fu
  • 2017-04-19 10:20:18
  • 967

关于“代码区,全局数据区,堆区,栈区”和“ 栈区,堆区,全局/静态存储区,常量存储区”两种不同的说法

转至 http://blog.sina.com.cn/s/blog_55846c2f01000aub.html 说法一  一个由c/C++编译的程序占用的内存分为以下几个部分 ...
  • bububu2012
  • bububu2012
  • 2015-07-13 13:33:04
  • 619

代码区、文字常量区、全局静态区、栈区、堆区的内存空间分布

学习结构体之后,就想着来看看栈上多个变量的地址的分配情况,是不是也有某种规则一个接一个挨着。不想发现连续的两个变量的地址并不连续,可以说分得很开,而且从高地址到低地址分配。 虽然并不知道系统(还是编...
  • swibyn
  • swibyn
  • 2016-11-24 17:38:43
  • 799

C语言内存分区_栈区、堆区、全局&静态区、文字常量区、程序代码区

C语言开发对内存使用有区域划分,分别是栈区、堆区、全局&静态区、文字常量区、程序代码区。注意此处的栈、堆名称有别于数据结构中栈与堆的概念。栈与堆的英文名分别为stack与heap。...
  • Filter_CPH
  • Filter_CPH
  • 2015-09-17 17:06:15
  • 1334

C语言程序内存四区(栈区,堆区,全局区,代码区)

一,综述 在C语言程序中, 代码在内存中进行执行的时候,我们粗略的将程序所占用的内存分为四个区域—-栈区,堆区,全局区,代码区. 每个程序都有唯一的四个内存区域.我们需要熟悉和了解各个区域的特性...
  • ic_tv
  • ic_tv
  • 2015-07-02 01:27:32
  • 2836

C语言不同变量内存区域(堆,栈,代码区,全局区,BSS段)

  • 2014年10月06日 21:22
  • 644B
  • 下载

C语言的内存管理分析 栈区 代码区 堆区 静态区 常量区

系统为了管理内存 把内存划分了几个区域      1> 栈区      栈区之中的数据在栈区之中以栈的形式进行存储.      栈区的特点:数据是先进后出,      放在栈区里...
  • u010672206
  • u010672206
  • 2015-07-18 22:47:42
  • 1616
收藏助手
不良信息举报
您举报文章:内存区分配(栈区堆区全局区)C++
举报原因:
原因补充:

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