浅谈内存管理
2016-04-16 21:14
232 查看
内存分区有哪些?
a)栈(stack):存储函数内部的变量,包括局部变量和形式参数,在进入函数时自动分配,离开函数时自动清除。
b)全局区:又叫静态区,存放全局变量和静态变量,全局变量也称外部变量,它是在函数外部定义的变量,全局
变量是所有函数的公用变量。静态变量和全局变量被分配到同一块内存中,静态局部变量仅限于在定义处的函数使
用,但是离开函数后数值一直保留,直到程序退出。静态区又分为数据段和代码段,数据段分为data段和bss段,
data段存放已初始化的静态变量和全局变量,bss段存放未初始化的静态变量和全局变量,并且会将这些变量初始
化为0.
我将linux虚拟机下的程序运行过程中的各段大小展示出来~~~
在linux虚拟机下,我写出以下代码,并保存在memory.c文件中。
用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指向低地址。
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指向低地址。
相关文章推荐
- 计算机程序的思维逻辑 (2) - 赋值
- 关于对DB2的“实例”的理解
- Android Studio 修改项目包名(最后一级)
- 什么是struts2?
- 交换机开发(三)—— 深入分析三层网络交换机的原理和设计
- Centos7安装TensorFlow
- manpath问题解决
- SVD分解的几何意义
- uml包图
- C++文件的存取
- mkdir递归创建目录
- 齐全的颜色中文叫法 RGB值
- Visible.GONE
- Mysql忘记密码,成功找回的经过!
- Git All the Payloads! A collection of web attack payloads. 20160416
- 性能测试学习笔记(一)
- 集体智慧编程--推荐系统
- 用java代码将阿拉伯数字金额转换成中文大写
- 解决VM虚拟机克隆linux、无法上网问题
- SQL存储过程登陆实例