c++ 内存分配过程(通过汇编,寄存器和Memory分析)

内存分配

示例1

int a[5];

汇编结果:没有分配内存

示例2

int a[5] = {1,2,3,4,5}

汇编结果:

  • movl $0x1c,0x1f(%esp) : 把立即数1存放在esp寄存器中指向地址+0x1c的地址( 0x6afefc)中
  • 后面的代码分别存储2,3,4, 5 到依次偏移4个字节的地址中(int 占 4个字节)
  • 在memory中查看6afefc地址中的数据

示例3

int *a = new int[3];

汇编结果:

  • movl $0xc,(%esp) 把立即数12存放在寄存器esp指向的地址中

    表明需要12个字节的存储空间、

示例4

 int *a = new int[3];
 *a = 1;
 *(a+1) = 2;
 *(a +2) = 3;

汇编结果:

  • movl $0xc,(%esp) 同上
  • mov %eax,0x1c(%esp) 把寄存器eax的值存储在0x1c(%esp)这个地址中
  • mov 0x1c(%esp),%eax 恢复寄存器eax的值
  • movl $0x1,(%eax) 把立即数1存到eax寄存器指向的地址中

后续步骤依次是:

  • 恢复寄存器eax的值
  • 在寄存器eax指向地址向后移动4个字节的地址中存储存储立即数2
  • 由于add把结果保存在eax中,此时eax是722ac4,知道初值应该是:722ac0 (其实就是0x1c(%esp) 中存储的值)
  • 在memory中查看722aco,发现依次存放1 和 2
时间: 2024-10-09 17:32:49

c++ 内存分配过程(通过汇编,寄存器和Memory分析)的相关文章

JVM内存模型及内存分配过程

一.JVM内存模型 JVM主要管理两种类型内存:堆(Heap)和非堆(Permanent区域). 1.Heap是运行时数据区域,所有类实例和数组的内存均从此处分配.Heap区分两大块,一块是 Young Generation,另一块是Old Generation: 1)在Young Generation中,有一个叫Eden Space的空间,主要是用来存放新生的对象,还有两个Survivor Spaces(from,to),它们的大小总是一样,它们用来存放每次垃圾回收后存活下来的对象. 2)在O

jvm内存模型,java类从编译到加载到执行的过程,jvm内存分配过程

一.jvm内存模型 JVM 内存模型主要分为堆.程序计数器.方法区.虚拟机栈和本地方法栈 1.堆 1.1.堆是 JVM 内存中最大的一块内存空间. 1.2.该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中. 1.3.堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,最后 Survivor 由 From Survivor 和 To Survivor 组成. 2.程序计数器(Program Counter Register) 程序计数器是一块很小的内存

数据结构中的堆和栈 与 内存分配中的堆区和栈区 分析

比較全面的总结了诸多版本号,知识无国界.感谢各位的辛勤劳作. 在计算机领域,堆栈是一个不容忽视的概念,我们编写的C/C++语言程序基本上都要用到.但对于非常多的初学着来说,堆栈是一个非常模糊的概念. (1) 数据结构的栈和堆 首先在数据结构上要知道堆栈,虽然我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈. 堆和栈都是一种数据项按序排列的数据结构. 栈就像装数据的桶或箱子 我们先从大家比較熟悉的栈说起吧.它是一种具有后进先出性质的数据结构,也就是说后存放的先取.先存放的后取.这就如同我们要取出

浅析栈区和堆区内存分配的区别

以下是对栈区和堆区内存分配的区别进行了详细的分析介绍,需要的朋友可以过来参考下 一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢?为了说明这个问题,我们先来看一下内存内部的组织情况. 从上图可知,程序占用的内存被分了以下几部分. 1.栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等,内存的分配是连续的,类似于平时我们所说的栈,如果还不清楚,那么就把它想成数组,它的内存分配是连续分

Java当中的内存分配以及值传递问题内存解析

首先必须说明作为Java程序员对于内存只要有大致的了解就可以了,如果你对Java当中的某一个知识点在不需要分析内存分配过程的情况下可以掌握,那就大可不必去研究内存.如果你对知识点已经掌握,那么你应该把更多的精力放在对业务逻辑的分析与设计上,这样的话你才可能这一行业走的更远. 好了废话不多说了,下面我带着大家先来简单的看一下Java当中所涉及的内存分配,接着我会以讲解Java当中的值传递问题,分析在代码执行的过程当中内存的状态. 一.Java当中所涉及到的内存分类 Java当中你知道这5种内存就够

浅析栈区和堆区内存分配的区别(转)

以下是对栈区和堆区内存分配的区别进行了详细的分析介绍,需要的朋友可以过来参考下 一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢?为了说明这个问题,我们先来看一下内存内部的组织情况. 从上图可知,程序占用的内存被分了以下几部分. 1.栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等,内存的分配是连续的,类似于平时我们所说的栈,如果还不清楚,那么就把它想成数组,它的内存分配是连续分

【线段树】【NOI 1999】【cogs 284】内存分配

284. [NOI1999] 内存分配 ★★☆ 输入文件:memory.in 输出文件:memory.out 简单对比 时间限制:1 s 内存限制:128 MB 内存是计算机重要的资源之一,程序运行的过程中必须对内存进行分配. 经典的内存分配过程是这样进行的: 内存以内存单元为基本单位,每个内存单元用一个固定的整数作为标识,称为地址.地址从0开始连续排列,地址相邻的内存单元被认为是逻辑上连续的.我们把从地址i开始的s个连续的内存单元称为首地址为i长度为s的地址片. 运行过程中有若干进程需要占用内

源码分析:Java对象的内存分配

Java对象的分配,根据其过程,将其分为快速分配和慢速分配两种形式,其中快速分配使用无锁的指针碰撞技术在新生代的Eden区上进行分配,而慢速分配根据堆的实现方式.GC的实现方式.代的实现方式不同而具有不同的分配调用层次. 下面就以bytecodeInterpreter解释器对于new指令的解释出发,分析实例对象的内存分配过程: 一.快速分配 1.实例的创建首先需要知道该类型是否被加载和正确解析,根据字节码所指定的CONSTANT_Class_info常量池索引,获取对象的类型信息并调用is_un

Java内存分配以及GC

转自http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html  写的太棒了,简单易懂 Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制.概括地说,该机制对 JV