美文网首页
正确的C++/C内存布局及两者的区别

正确的C++/C内存布局及两者的区别

作者: Mr吴标 | 来源:发表于2016-07-03 21:48 被阅读327次
在理解C/C++内存分区时,常会碰到如下术语:数据区,堆,栈,静态存储区,静态区,常量区,常变量区,全局区,字符串常量区,静态常量区,静态变量区,文字常量区,代码区等等,初学者被搞得云里雾里。在这里,尝试捋清楚以上分区的关系。[1]

        数据区包括:堆,栈,全局/静态存储区。
  全局/静态存储区包括:常量区(静态常量区),全局区(全局变量区)和静态变量区(静态区)。
  常量区包括:字符串常量区和常变量区。
  代码区:存放程序编译后的二进制代码,不可寻址区。
可以说,C/C++内存分区其实只有两个,即代码区和数据区。

一、真正合理的C++的内存划分为栈区、堆区、全局区/静态区和代码区。

这里去掉自由存储区,增加了代码区,理由会在下面讲到。

栈区:由系统进行内存的管理。
说明:主要存放函数的参数以及局部变量。栈区由系统进行内存管理,在函数完成执行,系统自行释放栈区内存,不需要用户管理。整个程序的栈区的大小可以在编译器中由用户自行设定,默认的栈区大小为3M。

堆区:由用户手动申请,手动释放。在C中使用malloc,在C++中使用new(当然C++中也可以使用malloc)。

全局/静态区:全局、静态数据存放在一起的,初始化的全局变量和静态变量是在一起的。未初始化的全局变量和静态变量是在相邻的空间中。这里包括常量区。

代码区:存放程序体的二进制代码。比如我们写的函数,都是在代码区的。

二、C语言的代码内存布局详解
     一个程序本质上都是由 BSS 段、data段、text段三个组成的。这样的概念在当前的计算机程序设计中是很重要的一个基本概念,而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。

BSS段:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内
               存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。
数据段:在采用段式内存管理的架构中,数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内
               存区域。数据段属于静态内存分配。
代码段:在采用段式内存管理的架构中,代码段(text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域属于只读。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

程序编译后生成的目标文件至少含有这三个段,这三个段的大致结构图如下所示:

![](https://img.haomeiwen.com/i2025286/a4bbd82077ef7d55.gif?imageMogr2/auto-orient/strip)

其中.text即为代码段,为只读。.bss段包含程序中未初始化的全局变量和static变量。data段包含三个部分:heap(堆)、stack(栈)和静态数据区。

堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
栈 (stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变 量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以 栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

相关文章

  • 正确的C++/C内存布局及两者的区别

  • C++之内存布局

    在C++之内存管理一文中,我们已经了解到C++的内存管理,这里介绍C++的典型内存布局结构。 1、总体来说,C/C...

  • C++内存对齐及内存布局

    前言   本文会展示内存对齐,及继承、虚继承等各个情况下内存的布局,并根据结果总结使用场景。 基本调试方法   使...

  • NSObject 底层本质

    一、OC 转 C/C++ 二、NSObject 对象内存布局 三、NSObject 内存大小 四、OC 对象内存布...

  • c++ 中 struct 的内存布局

    C++ or C 这里讨论的是 C++, 在C中内存布局差不多,但是也不尽相同。如一个空的struct,c++中大...

  • 百度Linux C++后台开发面试题(个人整理)

    1、C/C++程序的内存分区 其实C和C++的内存分区还是有一定区别的,但此处不作区分: 1) 、栈区(stack...

  • 19. java虚拟机总结-JVM 内存管理 (三)

    JVM 内存区域划分 1.为什么进行内存区域划分? Java自动内存管理机制是它和C++的区别所在。C++是手动内...

  • C++ 内存布局

    堆、栈、静态数据区、常量区、代码区以下是各个区的作用:(1)代码区:存放程序代码;(2)数据区a.静态数据区: 在...

  • 7.13

    Java与C++区别:对内存:彻底隐藏指针、提供垃圾回收机制减少内存泄漏程序崩溃后可以根据调用栈及Log定位错误位...

  • JVM学习笔记(2)---Java内存区域

    Java与C的内存管理区别 在C/C++中,需要使用 delete/free 等函数来手动释放内存;而在Java中...

网友评论

      本文标题:正确的C++/C内存布局及两者的区别

      本文链接:https://www.haomeiwen.com/subject/vqccjttx.html