进程的地址空间:TEXT,DATA,BSS,HEAP,STACK
2015-08-23 22:43
363 查看
现代操作系统对每个进程都分配了完整的虚拟内存地址空间。进程会把整个地址空间分成多个区间来使用。 程序员最为熟悉的两个区间莫过于堆和栈。然而还有其他的内存区间来存储代码、静态、全局变量等等。 本文来总结一下这些内存区间到底存的是哪些东西。先看图:
图片来源: SWAT
Blog
虚拟内存技术使得每个进程都可以独占整个内存空间,地址从零开始,直到内存上限。 每个进程都将这部分空间(从低地址到高地址)分为六个部分:
TEXT段:整个程序的代码,以及所有的常量。这部分内存是是固定大小的,只读的。
DATA段,又称GVAR:初始化为非零值的全局变量。
BSS段:初始化为0或未初始化的全局变量和静态变量。
HEAP(堆):动态内存区域,使用
未使用的内存。
STACK(栈):局部变量、参数、返回值都存在这里,函数调用开始会参数入栈、局部变量入栈;调用结束依次出栈。
其中堆和栈的大小是可变的,堆从下往上生长,栈从上往下生长。
由于常量存储在TEXT段中,所有对常量的赋值都将产生
可以认为BSS段中的所有字节都是0。因为未初始化的全局变量、静态变量都在BSS段中, 所以它们都会被初始化为0,同时类的成员变量也会被初始化为0,但编译器不保证局部变量的初始化。
上面说栈(STACK)是从上到下(高地址到低地址)分配的,而且我们知道, 函数的局部变量的空间是在进入函数体后才分配的,在栈空间里。来个例子来看看吧!
输出是
正常来讲先分配
然后对
上述结果和CPU端模式也有关系!我的CPU是小端字节序的~ 低位存的是低字节。
除非注明,本博客文章均为原创,转载请以链接形式标明本文地址: http://harttle.com/2015/07/22/memory-segment.html
图片来源: SWAT
Blog
虚拟内存技术使得每个进程都可以独占整个内存空间,地址从零开始,直到内存上限。 每个进程都将这部分空间(从低地址到高地址)分为六个部分:
TEXT段:整个程序的代码,以及所有的常量。这部分内存是是固定大小的,只读的。
DATA段,又称GVAR:初始化为非零值的全局变量。
BSS段:初始化为0或未初始化的全局变量和静态变量。
HEAP(堆):动态内存区域,使用
malloc或
new申请的内存。
未使用的内存。
STACK(栈):局部变量、参数、返回值都存在这里,函数调用开始会参数入栈、局部变量入栈;调用结束依次出栈。
其中堆和栈的大小是可变的,堆从下往上生长,栈从上往下生长。
由于常量存储在TEXT段中,所有对常量的赋值都将产生
segment fault异常。
可以认为BSS段中的所有字节都是0。因为未初始化的全局变量、静态变量都在BSS段中, 所以它们都会被初始化为0,同时类的成员变量也会被初始化为0,但编译器不保证局部变量的初始化。
上面说栈(STACK)是从上到下(高地址到低地址)分配的,而且我们知道, 函数的局部变量的空间是在进入函数体后才分配的,在栈空间里。来个例子来看看吧!
int main(){ char a=0, b=0; int *p = (int*)&b; *p = 258; printf("%d %d", a, b); return 0; }
输出是
1 2
正常来讲先分配
a的地址,再分配
b的地址,大小均为1字节,同时它们的地址是连续的!
然后对
b的地址进行赋值258(二进制表示是
1 0000 0002)。 后面8位
0000 0002赋值给了
b,前面的
1赋值给了
a。
上述结果和CPU端模式也有关系!我的CPU是小端字节序的~ 低位存的是低字节。
除非注明,本博客文章均为原创,转载请以链接形式标明本文地址: http://harttle.com/2015/07/22/memory-segment.html
相关文章推荐
- Devc++编译系统分配给int多少字节
- 1076. Forwards on Weibo (30) - 记录层的BFS改进
- POJ 3067 japan
- PHP实现页面跳转方法
- ESX6如何实现开机登录的界面
- 1076. Forwards on Weibo (30) - 记录层的BFS改进
- Wiki_Android_双击或多次点击事件
- TalkingData灵动分析背后的产品故事
- python import 产生的问题(name 'xml' is not defined)
- CocurrentHashMap和Hashtable的区别
- MySql常用函数大全讲解
- ibatis中使用List作为传入参数的使用方法及 CDATA使用
- git@osc使用教程
- 用64行代码实现生产者与消费者模型
- 4. 正则表达式(4)
- 可变数组NSMutableArray详解
- C++中的函数指针和函数对象
- HDU 1068 Girls and Boys二分图最大匹配
- 【剑指offer】二,变态跳台阶(java实现)
- 【.Net】关于内存缓存的一点记录