程序在内存中的分配方式

1 桟区(stack):由编译器自动分配和释放,存放函数的参数值,局部变量的值,其操作方式类似于数据结构中的栈。

若申请的内存小于系统所剩内存则成功,否则就会发生栈溢出错误。

栈的增长方向是向下的,通常栈的初始化指针指向内存的最高地址,它是连续的。系统自动分配,因此速度很快。

在函数调用时,第一个进栈的是主函数的下一条指令的地址,然后是各个函数的参数,参数从右向左进栈,然后是函数中的局部变量。静态变量是不入栈的。

2 堆区(heap):一般有程序员分配和释放,若不释放,最后由操作系统回收。

它与数据结构中的堆(树形结构)是两回事,分配方式更类似于链表。用malloc,或者new来分配,用free或者delete释放。

操作系统有一个记录空闲内存地址的链表,系统会遍历该链表寻找第一个空间大于所申请空间的堆节点,将该节点从空闲链表中删除,并将该节点的空间分配给程序,并在这块内存空间的首地址处记录本次分配的大小,这样delete才能正确释放该空间。

堆是向上增长的,是不连续的内存区域。用户分配,速度较慢,堆的头部用一个字节存放堆的大小,内容由程序员决定。

3 全局区(静态区)(static): 全局变量和静态变量的存放地点,初始化的全局变量和静态变量放在一起,未初始化的放在相邻的另一块区域,程序运行结束由操作系统回收。

4 文字常量区: 字符串常量通常放在这里,程序结束由操作系统释放。

5 程序代码区: 存放函数体的二进制代码。

程序在内存中的分配方式

时间: 2024-10-29 19:09:44

程序在内存中的分配方式的相关文章

内存管理--程序在内存中的分布

在多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中.这个沙盘就是虚拟地址空间(virtual address space). 1 32位虚拟内存布局 在32位模式下虚拟地址空间总是一个4GB的内存地址块.这些虚拟地址通过页表(page table)映射到物理内存,页表由操作系统维护并被处理器引用.每一个进程拥有一套属于它自己的页表,但是还有一个隐情.只要虚拟地址被使用,那么它就会作用于这台机器上运行的所有软件,包括内核本身.因此一部分虚拟地址必须保留给内核使用: 图 1 这并不意味

程序在内存中的分布

转载,原文地址:http://blog.csdn.net/hackbuteer1/article/details/6786811 在现代的操作系统中,当我们说到内存,往往需要分两部分来讲:物理内存和虚拟内存.从硬件上讲,虚拟空间是CPU内部的寻址空间,位于MMU之前,物理空间是总线上的寻址空间,是经过MMU转换之后的空间. 一般我们所说的程序在内存中的分布指的就是程序在虚拟内存中的存储方式. 从低地址到高地址,可分为下面几段: 预留内存地址(操作系统维护的内存地址,不可访问) 程序代码区(只读,

对一个程序在内存中的分析【转】

转自:http://blog.csdn.net/bullbat/article/details/7304404 bullbat  译 内存管理是操作系统的核心:它对于程序员和系统管理员都很关键.在接下来的几篇文章里面我将对内存的关键技术做谈论,但是不会远离其本质.然而概念很普通,例子多半来自32位X86系统的LINUX和Window操作系统.这第一篇文章谈论程序在内存中如何存放. 在多任务操作系统中的每一个进程运行在他自己的内存地址空间中.这个地址空间就是虚拟地址空间,虚拟地址空间在32位模式下

移码及浮点数在内存中的存储方式

首先说一下十进制的小数怎么转化为二进制的小数,计算机根本就不认识10进制的数据,他只认识0和1,所以,10进制的小数在计算机中是用二进制的小数表示的. 十进制的小数转化为二进制的小数的方法: 可以简单的概括为正序取整,将十进制的小数部分乘以2,然后取整数部分. 例如将0.2转化为二进制的小数,那么0.2*2=0.4,其整数部分是0,所以二进制小数的第一位为0,然后0.4*2=0.8,其整数部分是0,所以二进制小数的第二位为0,然后0.8*2=1.6,其整数部分是1,所以二进制小数的第三位是1,然

对象类型在内存中的分配

今天,我们来讲讲对象类型在内存中的分配! 对象类型和整型.字符串等类型一样,也是PHP中的一种数据类型,在程序中存储不同类型的数据,在程序运行时它的每一部分内容都要加载到内存中再被使用.那么对象类型的数据在内存中是如何分配的呢?咱们先来了解下内存结构,逻辑上内存大体被分为四段,分别为:栈.堆.数据段和代码段,程序中不同类型数据的声明将会被存放在不同的内存段里面,每段内存的特点是这样的: 1.栈 栈的特点就是空间小但被CPU访问的速度快,适合存放程序中临时创建的变量.由于栈的先进后出的特点,所以栈

PHP对象类型在内存中的分配

对象类型和整型.字符串等类型一样,也是PHP中的一种数据类型.都是在程序中用于存储不同类型数据使用的,在程序运行时它的每部分内容都要先加载到内存中再被使用.那么对象类型的数据在内存中是如何分配的呢?先来了解一下内存结构.逻辑上内存大体被分为四段,分别为栈空间段.堆空间段.初始化数据段和代码段,程序中不同类型数据的声明将会被存在不同的内存段里面.每段内存的特点如下.①.栈空间段栈的特点是空间小但被CPU访问的速度快,是用户存放程序中临时创建的变量.由于栈的后进先出特点,所以栈特别方便用来保存和恢复

QList介绍(QList比QVector更快,这是由它们在内存中的存储方式决定的。QStringList是在QList的基础上针对字符串提供额外的函数。at()操作比操作符[]更快,因为它不需要深度复制)非常实用

FROM:http://apps.hi.baidu.com/share/detail/33517814 今天做项目时,需要用到QList来存储一组点.为此,我对QList类的说明进行了如下翻译. QList是一种表示链表的模板类.QList<T>是Qt的一种泛型容器类.它以链表方式存储一组值,并能对这组数据进行快速索引,还提供了快速插入和删除等操作.QList.QLinkedList和QVector提供的操作极其相似:* 对大多数操作来说,我们用QList就可以了.其API是基于索引(inde

数组及其在内存中的分配

1.一维数组 ● 数组概念:数组是储存同一种数据类型多个元素的集合.也可以看成是一个容器.它既可以存储基本数据类型,也可以存储引用数据类型. ● 定义格式1: 数据类型[] 数组名:       格式2: 数据类型 数组名[]; ● 数组的初始化.动态初始化 数组的初始化:数组必须先初始化,然后才能使用,就是为数组中的数组元素分配内存空间,并为每个数组元素赋值 初始化分类: (1)动态初始化:只指定长度,由系统给出初始化值: (2)静态初始化:给出初始化值,由系统决定长度. 注意:这两种方式只能

C语言中浮点数在内存中的存储方式

关于多字节数据类型在内存中的存储问题 //////////////////////////////////////////////////////////////// int ,short 各自是4.2字节.他们在内存中的存储方式以下举个样例说明. int data = 0xf4f3f2f1; 当中低位存放在编址小的内存单元.高位存放在编址高的内存单元 例如以下: 地址:0x8000      0x8001    0x8002   0x8003 数据:   f1              f2