一条进程的栈区、堆区、数据区和代码区在内存中的映射 电玩女神 2022-05-25 13:47 190阅读 0赞 [http://www.cnblogs.com/liulipeng/archive/2013/09/13/3319675.html][http_www.cnblogs.com_liulipeng_archive_2013_09_13_3319675.html] 一条进程的栈区、堆区、数据区和代码区在内存中的映射 1>栈区:主要用来存放局部变量, 传递参数, 存放函数的返回地址。.esp 始终指向栈顶, 栈中的数据越多, esp的值越小。 2>堆区:用于存放动态分配的对象, 当你使用 malloc和new 等进行分配时,所得到的空间就在堆中。动态分配得到的内存区域附带有分配信息, 所以你 能够 free和delete它们。 3>数据区:全局,静态和常量是分配在数据区中的,数据区包括bss(未初始化数据区)和初始化数据区。 注意: 1)堆向高内存地址生长; 2)栈向低内存地址生长; 3)堆和栈相向而生,堆和栈之间有个临界点,称为stkbrk。 1、一条进程在内存中的映射 假设现在有一个程序,它的函数调用顺序如下: main(…) ->; func\_1(…) ->; func\_2(…) ->; func\_3(…),即:主函数main调用函数func\_1; 函数func\_1调用函数func\_2; 函数func\_2调用函数func\_3。 当一个程序被操作系统调入内存运行, 其对应的进程在内存中的映射如下图所示: ![13164929-585b8ebd439c458aa54555136622a6a1.jpg][] 注意: 1>随着函数调用层数的增加,函数栈帧是一块块地向内存低地址方向延伸的; 2>随着进程中函数调用层数的减少(即各函数调用的返回),栈帧会一块块地被遗弃而向内存的高址方向回缩; 3>各函数的栈帧大小随着函数的性质的不同而不等, 由函数的局部变量的数目决定。 4>未初始化数据区(BSS):用于存放程序的静态变量,这部分内存都是被初始化为零的;而初始化数据区用于存放可执行文件里的初始化数据。这两个区统称为数据区。 5>Text(代码区):是个只读区,存放了程序的代码。任何尝试对该区的写操作会导致段违法出错。代码区是被多个运行该可执行文件的进程所共享的。 6>进程对内存的动态申请是发生在Heap(堆)里的。随着系统动态分配给进程的内存数量的增加,Heap(堆)有可能向高址或低址延伸, 这依赖于不同CPU的实现,但一般来说是向内存的高地址方向增长的。 7>在未初始化数据区(BSS)或者Stack(栈区)的增长耗尽了系统分配给进程的自由内存的情况下,进程将会被阻塞, 重新被操作系统用更大的内存模块来调度运行。 8>函数的栈帧:包含了函数的参数(至于被调用函数的参数是放在调用函数的栈帧还是被调用函数栈帧, 则依赖于不同系统的实现)。函数的栈帧中的局部变量以及恢复该函数的主调函数的栈帧(即前一个栈帧)所需要的数据, 包含了主调函数的下一条执行指令的地址。 2、 函数的栈帧 函数调用时所建立的栈帧包含下面的信息: 1)函数的返回地址。返回地址是存放在主调函数的栈帧还是被调用函数的栈帧里,取决于不同系统的实现; 2)主调函数的栈帧信息, 即栈顶和栈底; 3)为函数的局部变量分配的栈空间; 4)为被调用函数的参数分配的空间取决于不同系统的实现。 注意: 1>bss区(未初始化数据段):并不给该段的数据分配空间,仅仅是记录了数据所需空间的大小。 2>data(初始化的数据段):为数据分配空间,数据保存在目标文件中。 http://zqwt.012.blog.163.com/blog/static/120446842010113091137224/ [http_www.cnblogs.com_liulipeng_archive_2013_09_13_3319675.html]: http://www.cnblogs.com/liulipeng/archive/2013/09/13/3319675.html [13164929-585b8ebd439c458aa54555136622a6a1.jpg]: /images/20220525/7d72faf5d2ea4b20b575b5e16e8d3cd4.png
相关 方法区、堆区、栈区存储数据的比较 方法区、堆区、栈区存储数据的比较 1. 方法区 2. 堆区 3. 栈区 4. 例子 5. 堆和栈的区别 1. 方法区 1. 保存所 小灰灰/ 2023年09月25日 18:02/ 0 赞/ 54 阅读
相关 JVM——什么是代码区、常量区、静态区(全局区)、堆区、栈区这些你知道吗? 什么是代码区、常量区、静态区(全局区)、堆区、栈区? 代码区: 常量区: 静态区(全局区): 堆区: 素颜马尾好姑娘i/ 2022年11月25日 00:35/ 0 赞/ 207 阅读
相关 bilibiliC++01-05程序的内存模型-内存四区-代码区、全局区、栈区、堆区-new运算符 C++核心编程 本阶段主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓。 1 内存分区模型 C++程序在执行时,将内存大方向划分为4个区域 r囧r小猫/ 2022年10月25日 01:33/ 0 赞/ 174 阅读
相关 栈区,堆区,全局区,文字常量区,程序代码区 详解 声明:本博文转载自[http://my.oschina.net/stawn/blog/155265][http_my.oschina.net_stawn_blog_15526 た 入场券/ 2022年08月12日 09:59/ 0 赞/ 229 阅读
相关 c++语言内存四区的概念:栈区,堆区,全局区,代码区 c++语言内存四区:栈区,堆区,全局区,代码区 栈区:又称为临时区,程序结束操作系统会自动回收内存。特点是内存提取速度快,但是容量有限,例如 int a=10; int bu 桃扇骨/ 2022年06月16日 10:58/ 0 赞/ 213 阅读
相关 C++中栈区 堆区 常量区 原文出自:http://baike.baidu.com/view/536145.htm C++中栈区 堆区 常量区(由一道面试题目而学习) 2009-04-28 21:01 ╰半橙微兮°/ 2022年06月13日 22:25/ 0 赞/ 279 阅读
相关 一条进程的栈区、堆区、数据区和代码区在内存中的映射 [http://www.cnblogs.com/liulipeng/archive/2013/09/13/3319675.html][http_www.cnblogs.com_ 电玩女神/ 2022年05月25日 13:47/ 0 赞/ 191 阅读
相关 内存分区-------堆区 栈区 全局数据区 代码区(转) 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的 「爱情、让人受尽委屈。」/ 2022年05月24日 05:25/ 0 赞/ 395 阅读
相关 内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区 [内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区][Link 1] 一. 在c中分为这几个存储区 1.栈 - 由编译器自动分配释放 2.堆 - 一般 梦里梦外;/ 2021年11月09日 12:56/ 0 赞/ 394 阅读
还没有评论,来说两句吧...