五个数据段之代码段、数据段、BSS、栈、堆
继上文讲完了对内存管理的一些知识,下面笔者再对上篇文章的内容加以拓展,那么我们今天就来说一说5个数据段
五个数据段
进程(执行的程序)会占用一定数量的内存,它或是用来存放磁盘载入的程序代码,或是存放取自用户输入的数据等等。不过,进程对这些内存的管理方式因内存的用途不一而不尽相同:有些内存是事先静态分配和统一回收的;有些却是按照需要动态分配和回收的。
对于任何一个普通的进程来说,他们都会涉及到5种不同的数据段。
代码段 --text(code segment/text segment)
代码段(text)段是程序代码段,通常存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前便已经确认,并且内存区域属于只读区域。在代码段中,存放着一些只读的常数变量,例如字符串常量。
数据段 --data
数据段属于静态内存分配,所有有初值的全局变量和用static修饰的静态变量,常量数据都在数据段中。
BSS段
BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量的一块内存区域。
Stack
栈(Stack)保存函数的局部变量、参数、返回值,但不包括static声明的静态变量。此外,栈是一种(LIFO,Last In First Out)的数据结构,这就意味着最后放到栈上面的数据,将会位于栈的顶端,会被第一个移走。栈的运行效率比堆快的多,但是它存储的信息量远不如堆,并且在函数调用完毕后,系统会清楚栈上保存的局部变量、函数的调用信息,就像我们在书中看到的,“某一个变量的生存期已到,Life is over”。最后一个我想说的是,栈还有一个重要的特征,就是它的地址空间是向着“地址减小”的方向增长。下面通过一个简单的C语言程序来具体说明一下:
#include <stdio.h>
void test(int _para)
{
int i=5,j=6;
int *p = &_para;
//首先输出参数地址,以及参数的值
printf("%p\t%d\n", p, *p);
p--;
//输出i地址及值
printf("%p\t%d\n", p, *p);
p--;
//输出j地址及值
printf("%p\t%d\n", p, *p);
char a[2]={0};
int b[2]={0};
//输出数组a的两个元素的地址
printf("%p\t%p\n", &(a[0]), &(a[1]));
//输出数组b的两个元素的地址
printf("%p\t%p\n", &(b[0]), &(b[1]));
}
int main(int argc, char * argv[])
{
test(4);
return 0;
}
下面是程序的输出结果,可能因电脑的不同,结果不唯一
0x7fff5012998c 4
0x7fff50129988 5
0x7fff60129984 6
0x7fff50129976 0x7fff50129977
0x7fff50129990 0x7fff50129994
通过上述结果,我们知道,栈上面保存的数据越多,最早入栈的元素的地址就会越低。
堆(heap)
堆(heap)保存函数内部动态分配内存,是另外一种用来保存程序信息的数据结构,更准确的说是保存程序的动态变量。堆是“先进先出”(First In first Out,FIFO)数据结构。它只允许在堆的一端插入数据,在另一端移走数据。堆的地址空间“向上增加”,即当堆上保存的数据越多,堆的地址就越高。这一点恰恰与栈相反。
如下图
名称 | 内容 |
代码段 | 可执行代码、字符串常量 |
数据段 | 已初始化全局变量、静态变量、常量数据 |
BSS段 | 未初始化全局变量、静态变量 |
栈 | 局部变量、函数参数 |
堆 | 动态分配内存 |
这五个数据段的功能已经由上文呈现,不足之处欢迎大家指出,一起加油!☺️
笔者这篇文章主要参考了
http://blog.csdn.net/love_gaohz/article/details/41310597
update by 2017/3/29 22:11
By 一枝猪
五个数据段之代码段、数据段、BSS、栈、堆的更多相关文章
- Android NDK开发篇(五):Java与原生代码通信(数据操作)
尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用 ...
- [Head First Python]6. 定制数据对象:打包代码与数据
相同功能,演进实现 数据文件 sarah2.txt sarah Sweeney,2002-6-17,2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55 1- 返回 ...
- 数据段、代码段、堆栈段、BSS段的区别
进程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用 途 不一而不尽相同,有些内存是事先静态分配和统一回收的 ...
- (转)Linux下数据段的区别(数据段、代码段、堆栈段、BSS段)
进程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途 不一而不尽相同,有些内存是事先静态分配和统一回收的, ...
- 【转】可执行程序包括BSS段、数据段、代码段
可执行程序包括BSS段.数据段.代码段(也称文本段). 一.BSS BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域.特点是:可 ...
- C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 : ...
- bss段,代码段及数据段,堆栈段的区别
bss段,代码段及数据段,堆栈段的区别 时间:2012-11-21 10:0772人阅读 BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英 ...
- LINUX下目标文件的BSS段、数据段、代码段
http://blog.chinaunix.net/uid-27018250-id-3867588.html bss 未初始化的全局数据 data 已经初始化的全局数据 text 代码段,机器指令 r ...
- 程序运行中(BSS段、数据段、代码段、堆栈)
程序运行中(BSS段.数据段.代码段.堆栈) BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简 ...
随机推荐
- Windows下搭建Git 服务器: BONOBO GIT SERVER + TortoiseGit
本文将介绍如何在Windows操作系统下搭建Git服务器和客户端.服务器端采用的是Bonobo Git Server,一款用ASP.NET MVC开发的Git源代码管理工具,界面简洁,基于Web方式配 ...
- Java初学者:深度辨析"=="与equals的区别
Java初学者:深度辨析"=="与equals()方法的区别 1.基本数据类型当中,"=="比较的是两个变量的值 int a=5; int b=4; 3 int ...
- --使用oracle数据先要创建表空间
one\--创建表空间 CREATE TABLESPACE 表空间的名字DATAFILE 'E:\oracle\app\userdata\java5space.dbf' --表空间物理文件路径SIZE ...
- python基础===使用switch方法,减少使用if语句
def jia(x,y): return x+y def jian(x,y): return x-y def cheng(x,y): return x*y def chu(x,y): return x ...
- CSSc常用样式
一.CSS常用文本属性 1.css中的颜色表示方式 1.1直接使用颜色的单词表示:red.green.blue 1.2使用颜色的十六进制表示:#ff0000,#00ff00: ...
- Wincc flexable的按钮组态
1.题目 2.画面切换按钮组态 1)新建变量 2)组态画面进行命名 3)组态按钮常规 4)组态按钮属性 5)在事件中选择单击,系统函数中选择画面中的ActivateScreen函数切换画面 3.给变量 ...
- WSGIweb框架--1
from multiprocessing import Process import re import sys import socket #设置静态文件根目录 HTML_ROOT_DIR = '. ...
- 【Tomcat】shell获得war包
功能: 将maven项目打包复制到tomcat/webapps set git=C:\Users\zhengwenqiang\git set tomcat=e:\tomcat7.0.64 c: cd ...
- Flink 1.3.2 Standalone模式安装
一.依赖文件安装 1.1 JDK 参见博文:http://www.cnblogs.com/liugh/p/6623530.html 二.文件准备 2.1 文件名称 flink-1.3.2-bin-ha ...
- CSS三种样式表
1.外部样式表当样式需要应用于很多页面时,外部样式表将是理想的选择.在使用外部样式表的情况下,你可以通过改变一个文件来改变整个站点的外观.每个页面使用 <link> 标签链接到样式表. & ...