【c++】内存分区

【学习自用】

四种分区和五种分区本质没差别

四种分区

1.代码区(.text 段)

存放 CPU 执行的机器指令。通常代码区是可共享的(即另外的执行程序可以调用它),使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息。

总结:你所写的所有代码都会放入到代码区中,代码区的特点是共享和只读。

2.全局区/静态存储区(.bss 段和 .data 段)

存放全局变量和静态变量,程序运行结束操作系统自动释放,在 C 语言中,未初始化的放在 .bss 段中,初始化的放在 .data 段中,C++ 中不再区分了。

在程序编译时分配

BSS段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的或者初始值为0的全局变量的一块内存区域。一般在初始化时 BSS 段部分将会清零。BSS段属于静态内存分配,即程序一开始就将其清零。

数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

全局区分初始化区和未初始化区,为了在磁盘上存储程序的时候减少所需空间。

初始化的放在data段,未初始化的放在bss段(初始化为0的也可能放在bss段)

对于初始化的global变量,例如int x = 10;
那么10这个数据必须在目标文件中保存起来,然后在OS程序加载的时候,复制到相应的内存。10这个实际的数据就会保存在目标文件中的data段。
而如果是未初始化的数据(也就是说初始值0是合适的),就没有必要在目标文件中保存0这个值,而只需要记录一个字节数,来告诉OS有多少字节需要在程序加载到内存的时候清空为0。这些信息就保存在bss段。
bss段主要是为了节省程序的目标文件或者说可执行文件所占的磁盘空间。

3.常量存储区(.data 段)

存放的是常量,不允许修改,程序运行结束自动释放。

const修饰的全局变量、字符串常量等

4.栈

栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。

除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以 栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

5.堆

堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

总结

操作系统将一整块内存划分了几个区域,每个区域用来做不同的事情

text段:存储程序的二进制指令,即程序源码编译后的二进制代码

data段:存储已被初始化的全局变量、常量

bss段:存储未被初始化的全局变量,和data段一样都属于静态分配,在编译阶段就确定了大小,不释放

stack段(栈空间):主要用于函数调用时存储临时变量的,这部分的内存是自动分配,自动释放的

heap段(堆空间):主要用于动态分配,C语言中malloc和free操作堆内存,Go语言主要靠GC自动管理这部分。

C++程序执行时,将内存大致划分为四个区域

代码区:存放函数的二进制代码,由操作系统 进行管理

全局区:存放全局变量和静态变量以及常量

栈区:由编译器自动分配释放,存放函数的参数值、局部变量等

堆区:由程序员分配和释放,若不释放,程序结束时由操作系统回收

好文推荐

C++ 学习(九)内存分区(代码区、全局区、栈区、堆区)
C/C++程序内存的各种变量存储区域和各个区域详解

posted @ 2022-12-16 15:25  稻花香里亦江湖  阅读(102)  评论(0编辑  收藏  举报