• 代码区

    ​ 程序被操作系统加载到内存时,所有可执行的代码被加载到代码区,也叫代码段,存储程序的代码指令。程序运行时,这段区域数据不可被修改只可以被执行。

  • 静态区

    ​ 程序中的静态变量、全局变量存放在此区域(初始化的全局变量和静态变量在一块区域)。代码执行期间一直占用内存!

  • ​ 堆是不连续的内存区域,获得的空间比较灵活,也比较大,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。需要程序员申请的内存空间,空间的释放一般由程序员控制(比如new, delete, malloc, free)。当程序员没有释放该内存空间的时候,程序运行完毕时操作系统会对该内存空间进行回收。

  • ​ 栈是一块连续的内存的区域,一般栈的大小都是预先设置好的,如果申请的空间超过栈的剩余空间时,将提示overflow。存放的通常是变量通常是局部变量、函数参数等。

  • 文字常量区

    ​ 常量字符串就是放在这里的。 程序结束后由系统释放。

  • bss段

    ​ 定义而没有赋初值的全局变量和静态变量,放在这个区域,通常只是记录变量名和大小,相当于一个占位符。

​ 一个程序本质上都是由 .bss段、.data段、.text段三个组成的。.data段包含三个部分:heap(堆)、stack(栈)和静态数据区。.text段存放代码区。.bss 里面装载了未被初始化的数据;如图:

示例如下:

int a = 0; //全局初始化区(静态区)
char *p1; //全局未初始化区 (BSS段)
int main()
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456/0在常量区,p3在栈上。
static int c = 0; //全局(静态)初始化区 (静态区)
p1 = (char *)malloc(10); //分配得10和20字节的区域就在堆区。
p2 = (char *)malloc(20);
strcpy(p1, "123456");
//123456/0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。
return 0;
}

可以联合之前所写的关于链接的一些总结,引用那张图如下:

![多个可重定位对象文件合并成可执行文件的过程](https://img2018.cnblogs.com/blog/1047362/201901/1047362-20190126161447331-197666169.jpg)

C++—程序的内存分区的更多相关文章

  1. C/C++的四大内存分区 分类: C/C++ 2015-05-09 01:36 163人阅读 评论(0) 收藏

    导读 正确的理解C/C++程序的内存分区,是合格程序猿的基本要求. 网络上流形两大版本内存分区,分别为: 1. 五大内存分区:堆.栈.全局/静态存储区.自由存储区和常量存储区. 2. 五大内存分区:堆 ...

  2. C/C++的四大内存分区和常量的存储位置

    原文:https://blog.csdn.net/k346k346/article/details/45592329 正确的理解C/C++程序的内存分区,是合格程序猿的基本要求. 网络上流形两大版本内 ...

  3. c语言学习之基础知识点介绍(十八):几个修饰关键字和内存分区

    一.几个修饰关键字 全局变量: 全局变量跟函数一样也分为声明和实现.如果是全局变量,实现在它调用之后,那么需要在调用之前进行声明.注意:全局变量的声明只能写在函数外,写在函数就不是全局变量了而是局部变 ...

  4. JVM的内存分区

    JVM的内存分区 这篇文章尝试讨论清楚JVM的内存分区情况. 1.       JVM的内存和系统内存的关系 下图是对系统内存及JVM内存的大致描绘 对大多数操作系统,内存可以分为物理内存RAM及Sw ...

  5. jvm性能优化及内存分区

     jvm性能优化及内存分区 2012-09-17 15:51:37 分类: Java Some of the default values for Sun JVMs are listed below. ...

  6. C/C++内存分区

    C/C++编译的程序占用的内存分区 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数名,局部变量的名等.其操作方式类似于数据结构中的栈. 2.堆区(heap)— 由程序员分配释放, 若 ...

  7. C++:内存分区

    前言:最近正在学习有关static的知识,发觉对C++的内存分区不是很了解,上网查了很多资料,遂将这几天的学习笔记进行了简单整理,发表在这里 • 栈区(stack):主要用来存放函数的参数以及局部变量 ...

  8. C++ 构造函数_内存分区_对象初始化

    内存分区 栈区:int  x = 0:int  *p = NULL; 定义一个变量,定义一个指针时,会在栈区进行分配内存.分配的内存系统分配收回的,我们不用管. 堆区:int  *p = new  i ...

  9. linux下C/C++程序的内存布局

    内核空间和用户空间: 我们在编写程序时使用的内存空间叫虚拟内存,程序在运行时,要完成虚拟内存到物理内存的转换.假如在32位环境上,理论上我们可以使用的虚拟内存空间是4GB,但实际上这4GB并不能完全给 ...

随机推荐

  1. WindowsPE权威指南 第二章 小工具 PEInfo代码的C语言实现

    主程序代码 PEInfo.c #include <Windows.h> #include<Richedit.h> #include "resource.h" ...

  2. spring boot + vue + element-ui全栈开发入门

    今天想弄弄element-ui  然后就在网上找了个例子 感觉还是可以用的  第一步是完成了  果断 拿过来  放到我这里这  下面直接是连接  点进去 就可以用啊 本想着不用vue   直接导入连接 ...

  3. sjms-4 行为型模式

    行为型模式 责任链模式 内容:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.角色:抽象处理者(Hand ...

  4. 记一次需要用到复杂的groupingBy的需求

    一:先定义结构 public class Foo { private Integer id; private String name; private BigDecimal amount; publi ...

  5. REdis zset和double

    平台:x86_64 结论:Zset的最大分数不要超过18014398509481982(17位数字,54位二进制),否则不会得到期望的值. REdis:5.0.4 Zset采用double存储分数值( ...

  6. JAVA EE:第一个例子(登录)

    名称 代码 说明 web.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xm ...

  7. [leetcode268]Missing Number

    Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...

  8. 关于字符的C++函数

    toupper(), tolower()不会改变原来的字符; 如果输入不是字母, 返回值跟原字符相同. isupper(), islower()..

  9. 前端 javascript

    ---恢复内容开始--- JavaScript  JavaScript:是一门编译型的语言,比python语言还要弱类型的语言 JavaScript 分为三个部分:Ecmascript.dom.bom ...

  10. jdango

    1.jdango的下载 命令行: pip install django ==1.11.18 pip install django ==1.11.18 -i https://pypi.douban.co ...