程序运行时堆区和栈区的分配
本文为转载,由孙晓明老师所编写,放在我的博客里面主要是为了自己学习方便。
栈(stack):是自动分配变量,以及函数调用所使用的一些空间(所谓的局部变量),地址由高向低减少;
堆(heap):由malloc,new等分配的空间的地址,地址由低向高增长。
看看下面一段代码:
#include <iostream>
using namespace std;
void main()
{
int a;
int b;
int *p1
int *p2;
cout << &a << endl << &b << endl << &p1 << endl << &p2 << endl ;
//结果显示:0012FF7C,0012FF78,0012FF74,0012FF70;可见,栈中的地址是减少的
int *p3=new int[1];
int *p4=new int[1];
cout<<p3<<endl<<p4<<endl;
//结果显示:003907A8,003907E0;可见,堆中地址是增加的
}
有一点应该注意:频繁使用heap 会产生内存碎片,而按照堆栈的先入后出原则,即先申请的后释放原则可以有效地避免在堆中产生碎片。
栈区中的局部数据占有的空间在函数结束后会自动释放,而堆中的要由程序员手动释放。
堆和栈中的存储内容
Stack栈: 在函数调用时,第一个进栈的是主函数中 函数调用语句的下一条可执行语句的地址,然后是函数的各个参数,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
heap堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。
程序的内存分配
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。与数据结构栈类似
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事。
3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区(text)—存放函数体的二进制代码。
引用的一个例子:
//main.cpp
int a = 0; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456\0在常量区,p3在栈上。
static int c = 0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456");
//123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。
}
原文链接地址: http://mayer.spaces.eepw.com.cn/articles/article/item/64846
程序运行时堆区和栈区的分配相关推荐
- Java运行时数据区及对象的分配
一.Java运行时数据区 简图: 简述: 堆.方法区是线程共享的,虚拟机栈.程序计数器.本地方法栈是线程私有的,一个线程一份. 虚拟机栈的基本单位是栈帧,一个方法的开始执行意味着一个栈帧进栈,一个方法 ...
- 程序运行时的存储组织及管理
目录 程序运行时的存储组织及管理概述 静态存储分配 临时变量的地址分配 简单栈式动态存储 嵌套过程语言的栈式实现 display 表方法 存取链(静态链)方法 参数传递 程序运行时的存储组织及管理概述 ...
- JVM运行时数据区和各个区域的作用
一.JVM主要分为5个核心区域(6个子区域),分别是: 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 *运行时常量池(属于"方法区"的一部分) 二.各个区域作用和描 ...
- 程序运行时对应的内存分布(BSS段、数据段、代码段、堆、栈)关系
参考:程序运行时对应的内存分布关系 作者:嵌入式基地(公众号) 发布时间: 2021-04-28 网址:https://mp.weixin.qq.com/s/AVDPZawSjg9HtxEm8vsFB ...
- jvm运行时数据区是干啥的?CPU切换线程会不会突然忘记程序执行到哪一步了
目录 还是那张JVM总体图 线程 程序计数器(PC寄存器) 使用PC寄存器存储字节码指令地址有什么用呢?为什么使用PC寄存器记录当前线程的执行地址呢? PC寄存器为什么会被设定为线程私有? CPU时间 ...
- 1、虚拟机内存管理、运行时数据区、线程共享区、Java堆、新生代、老年代、Eden区域分配、方法区、线程独占区、虚拟机栈
1.Java虚拟机内存管理 1.1.运行时数据区[Runtime Data Area] 1.1.1.线程共享区 1.1.1.1.Java堆[heap] 1.1.1.1.1.新生代.老年代.Eden区域 ...
- 以独占方式锁定此配置文件失败.另一个正在运行_JVM深入解析:运行时数据区+HotSpot+JMM+堆+GC+JVM优化+类加载
Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途.创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用 ...
- 四.运行时数据区-本地方法栈(Native Method Stack)-堆-方法区
1. 前言:本地方法接口 1.1 本地方法 简单来讲,一个Native Method就是一个java调用非java代码的接口,一个Native Method 是这样一个java方法:该方法的实现由非J ...
- Java程序员必知必会之JVM运行时数据区
JVM类加载概述 JVM垃圾回收概述 运行时数据区概述 程序计数器(Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,指向下一个将要 ...
最新文章
- Jenkins 在 Kubernetes 上的实践
- EBS报表 查看输出 FNDWRR.exe
- tomcat需要设置环境变量吗
- JdbcTemplate中的query方法(代码)
- MySQL使用用户变量需确定取值的顺序
- kafka集群安全化之启用kerberos与acl
- Word中如何设置图片与段落的间距为半行
- java平台调试架构JPDA
- SQL联合主键 查重
- FPGA时序约束设计经验总结
- 挖掘经典:几乎被人遗忘的HTML七种用法
- 千万级数据清洗ETL设计方案
- 计算机存储数据时2的20次方,2的20次方是多少
- 《 Kubebuilder v2 使用指南 》-P1-总览篇
- Lua+Redis+OpenResty实现电商详情页
- H5+CSS初级试题
- 虚拟机环境安装 | 查看修改主机名
- 2017江苏高职计算机分数线,2017—2019江苏高考招生投档分数线(体育高职专科院校).docx...
- Kubernetes 1.14:Windows节点的生产级支持、Kubectl更新、持久本地卷GA
- SAP客户端多语言设置