C++代码在编译完成后会生产.exe程序(windows平台), .EXE以文件的形式存储在磁盘上,当运行.exe程序的时候

操作系统会将磁盘上的.exe文件加载到内存中,那么在加载到内存中的时候,操作系统是如何在内存中存放这个exe程序的?

有没有区域的划分?那么是如何划分的?

首先需要了解一点,程序加载到内存中,是不能直接加载到物理内存中的

现在我们以 X86平台的Linux 环境举例

当我们一个程序(进程)在启动执行时,操作系统会为其分配一个4G(2的32次方)的内存空间(就是进程的虚拟内存地址空间)

如下图内存分配图

点击查看代码
#incclude <iostrea>
using namespace std; int gdata1=1;
int gdata2=0;
int gdata3; static int gdata4=10;
static int gdata5=0;
static int gdata6;
int main(){ int a=100;
int b=0;
int c; static int d=1000;
static int e=0;
static int f;
return 0;
}

如上面代码中的全局变量

gdata1,gdata2,gdata3,gdata4,gdata5,gdata6

无论是普通的还是静态的,他们都叫"数据",每一个数据在编译后,在符号表中都会产生符号.

gdata1和gdata4 初始化了的,而且值部不为0,所以存储在.data段

gdata2和gdata5 初始化了,但是值为0,所以存储在.bss段

gdata3和gdata6 未初始化,存储在.bss段

main 函数中的 a,b,c 不是数据,不会在符号表中产生符号,他们编译只产生指令

例如:move dword prt[a], och ,他们是存储在.text段,当程序运行到这里时,他们是在栈上分配空间的

对于静态的局部变量 如 d,e,f 也是数据,存放在数据段,也会在符号表中产生符号,

程序启动的时候不会初始化,而是在第一次运行到的时候才会初始化, d存储在.data段,e,f存储在.bss段

打印C的值,是一个栈上的随机值,打印f,由于存储在.bss段,系统会负责为.bss段做初始化,置0,所以打印出来f为0

上面红框部分存储在代码段,蓝色框部分存储在数据段

注意:不同的进程之间,用户空间是私有的,内核空间是共享的

<一>关于进程虚拟地址空间区域内存划分和布局的更多相关文章

  1. java内存划分

    运行时数据区域 Java虚拟机在执行Java的过程中会把管理的内存划分为若干个不同的数据区域.这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,而有的区域则依赖线程的启动 ...

  2. Windows进程通信 -- 共享内存(1)

    共享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信.因为是通过内存操作实现通信,因此是一种最高效的数据交换方法. 共享内存在 W ...

  3. JVM内存划分

    JVM内存划分吗? 前言: 大家都知道虚拟机,都知道JVM,其实这些都是基于sun公司[oracle公司]的HotSpot虚拟机,当然本篇博文也是以sun公司为基础.还有其他的虚拟机,常见的就有JRo ...

  4. Java运行时内存划分

    这篇文章可以说是摘抄自周志明的<深入理解Java虚拟机>,但是加上了自己的理解,印象可以更深些. Java虚拟机在执行Java程序的时候会把他所管理的内存划分为若干个不同的数据区域,各个区 ...

  5. java 虚拟机内存划分,类加载过程以及对象的初始化

    涉及关键词: 虚拟机运行时内存 java内存划分 类加载顺序  类加载时机  类加载步骤  对象初始化顺序  构造代码块顺序 构造方法 顺序 内存区域   java内存图  堆 方法区 虚拟机栈 本地 ...

  6. 深入理解java虚拟机(一)虚拟机内存划分

    Java虚拟机在执行Java程序时,会把它管理的内存划分为若干个不同的数据区.这些区域有不同的特性,起不同的作用.它们有各自的创建时间,销毁时间.有的区域随着进程的启动而创建,随着进程结束而销毁,有的 ...

  7. Windows进程通信 -- 共享内存

    享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信.因为是通过内存操作实现通信,因此是一种最高效的数据交换方法. 共享内存在 Wi ...

  8. PG进程结构和内存结构

    ​ 本文主要介绍PostgreSQL数据库(后文简称PG)进程结构和内存结构,物理结构将在后续继续整理分享. ​ 上图描述了PG进程结构.内存结构和部分物理结构的内容.图中的内容包含了两个部分: PG ...

  9. Linux进程的虚拟内存区域划分

    Linux进程的虚拟内存区域分为:代码区.只读常量区.全局区.BSS段.堆区.栈区 代码区:存储功能代码,函数名所在的区域 只读常量区:存放字符串常量,以及const修饰的全局变量 全局区/数据区:存 ...

随机推荐

  1. 一款性价比很高的PLC网关如何采集西门子PLC到Thingsboard

    PLC转MQTT网关金鸽BL100 西门子S7-200smart对接thingsboardBL102是一款采集西门子.三菱.欧姆龙.台达.AB.施耐德等各种PLC数据转换为Modbus TCP.OPC ...

  2. Thymeleaf是什么?该如何使用。

    先了解Thymeleaf是什么 1. Thymeleaf 简介 Thymeleaf 是新⼀代 Java 模板引擎,与 Velocity.FreeMarker 等传统 Java 模板引擎不同,Thyme ...

  3. 【Java中的线程】java.lang.Thread 类分析

    进程和线程 联想一下现实生活中的例子--烧开水,烧开水时是不是不需要在旁边守着,交给热水机完成,烧开水这段时间可以去干一点其他的事情,例如将衣服丢到洗衣机中洗衣服.这样开水烧完,衣服洗的也差不多了.这 ...

  4. 6.1 NOI 模拟

    \(T1\ pocky\) 要求式子 \[\sum_{i=2}^n a_i\times \gcd(a_i,a_{i-1}) \] 考虑可以枚举\(a_i,a_{i-1}\)的值,然后插板法,枚举每个位 ...

  5. Sphere类定义

    这个类是球体,也就是一会要显示的球体了.这个类继承于Geometrics类,并实现了自己的碰撞检测,碰撞原理,书上也说的很清楚了啊,大家多看.然后对照代码就明白了. 类定义: #pragma once ...

  6. 关于KeyFile的破解,含注册机源代码

    程序来自于<加密与解密3>的第五章的PacMe.exe.书中并没有给出C语言实现的加密与解密代码,自己花了一些时间,把代码还原了,并且写了一个C语言的注册机. 加密原理:正如书中所说,此程 ...

  7. TS 泛型推断好难啊,看看你能写出来不

    前言 最近做东西都在用ts,有时候写比较复杂的功能,如果不熟悉,类型写起来还是挺麻烦的.有这样一个功能,在这里,我们就不以我们现有的业务来举例了,我们还是已Animal举例,来说明场景.通过一个工厂来 ...

  8. Spring 02: Spring接管下的三层项目架构

    业务背景 需求:使用三层架构开发,将用户信息导入到数据库中 目标:初步熟悉三层架构开发 核心操作:开发两套项目,对比Spring接管下的三层项目构建和传统三层项目构建的区别 注意:本例中的数据访问层, ...

  9. CSS 选择器(一):属性选择器

    属性选择器的介绍 属性选择器顾名思义就是通过标签的属性来查找标签的选择器.让我们来回忆一下标签的属性是什么?HTML5 的所有标签共同拥有的属性叫作全局属性,除此之外还有标签自己拥有的属性,就叫作私有 ...

  10. BZOJ4212 神牛的养成计划 (字典树,bitset)

    题面 Description Hzwer成功培育出神牛细胞,可最终培育出的生物体却让他大失所望- 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神牛特征的基因序列都被破坏了, ...