浅谈内存管理
来源:互联网 发布:极速法术升级数据 编辑:程序博客网 时间:2024/05/18 11:25
内存分区有哪些?
a)栈(stack):存储函数内部的变量,包括局部变量和形式参数,在进入函数时自动分配,离开函数时自动清除。
b)全局区:又叫静态区,存放全局变量和静态变量,全局变量也称外部变量,它是在函数外部定义的变量,全局
变量是所有函数的公用变量。静态变量和全局变量被分配到同一块内存中,静态局部变量仅限于在定义处的函数使
用,但是离开函数后数值一直保留,直到程序退出。静态区又分为数据段和代码段,数据段分为data段和bss段,
data段存放已初始化的静态变量和全局变量,bss段存放未初始化的静态变量和全局变量,并且会将这些变量初始
化为0.
我将linux虚拟机下的程序运行过程中的各段大小展示出来~~~
在linux虚拟机下,我写出以下代码,并保存在memory.c文件中。
<pre name="code" class="objc">#include<stdio.h>static int m = 2; int i;int g_i = 0;static int n;int main(){ int j = 0; printf("love you");}
用gcc memory.c编译文件,用size指令size a.out来观察各段大小
当我删除未初始化的全局变量,也就是int i ;时,再编译运行。
所以说,未初始化的全局变量在bss段。
接下来,删除语句static int n;运行。
bss段的大小又少了4,那么未初始化的静态变量也在bss段。
删除int g_i = 0;语句后,情况又将如何呢??
已初始化的全局变量也在bss段。咦,这好像和上边整理的不一样呢。到底是什么原因呢??bss段一般放的变量系
统都会给他初始化,就相当于bss段放的变量也是初始化了的。
用同样的方法测试删除已经初始化的静态变量,他是存放在data段的,这里就不给出了。
特别的,我们来删除main函数里的变量int j = 0;这次又会出现怎样的现象呢??
此图我们可以看出text段的内容减少了,这并不是说,局部变量存放在text里,而是变成机器码存放在文本text中。
最后我们可以得到这样一张关于a.out的图 :
c)堆(heap):由调用malloc,realloc等等函数分配的内存块,使用完后需要释放;
d)常量存储区:存放程序内所有字符串常量,这个内存区域上存储的内容不允许修改,直到程序退出为止。
内存四区的特点:
a)全局区的变量空间缺省每个字节都是00,栈空间缺省是cc,堆缺省是cd。
b)堆、全局区(静态区)、字符串常量区比较靠近,与栈空间距离大;
c)常量区的内存是只读的,写入时程序崩溃;
d)访问速度是栈最快。
关于栈:栈是从高地址向低地址增长。ebp指向栈的高地址,esp指向低地址。
- linux 内存管理浅谈
- 浅谈Linux内存管理
- IOS内存管理浅谈
- 浅谈linux内存管理
- 浅谈linux内存管理
- 浅谈 Qt 内存管理
- 浅谈内存管理
- iOS内存管理浅谈
- 浅谈linux内存管理
- 浅谈iOS内存管理
- 浅谈 Qt 内存管理
- 浅谈OC内存管理
- 浅谈iOS内存管理
- 浅谈C++内存管理
- 浅谈iOS内存管理
- 浅谈内存管理
- java内存管理浅谈
- 内存管理浅谈
- 二、Python 进阶 之 模块
- 用户接口
- mac osx下载安装java运行环境
- Light OJ 1315 - Game of Hyper Knights
- 【Arduino官方教程第一辑】示例程序 1-2 Arduino工程的最小单元
- 浅谈内存管理
- 游戏引擎架构选摘之第五章 游戏支持系统
- 入门Android开发--第一行代码--笔记系列(Intent)
- 没事写个冒泡排序
- Windows 系统安装 Apache 服务器
- 共同学习Java源码--常用数据类型--String(十六)
- 【hdu1358】Period——KMP
- java学习笔记(从搭建环境到入门java)
- 一些Java中常用的定义(2)