0%

C++内存分配

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。   

  • 栈: 存放函数的参数值,局部变量,函数执行结束时会被自动释放。栈内存分配运算内置于处理器的指令集中,效率高,但是容量有限。
  • 堆: 是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。。
  • 自由存储区: 是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。
  • 全局/静态存储区: 全局变量和静态变量被分配到同一块内存中,在C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。(data段:初始化的段;bss段:未初始化的段)
  • 字符常量存储区: 常量字符串存于此,程序结束时由系统释放;

实例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <bits/stdc++.h>
using namespace std;

static int a; // 未初始化的静态变量——全局/静态存储区(bss段)

static int b = 1; // 初始化的静态变量——全局/静态存储区(data段)

int c; // 未初始化的全局变量——全局/静态存储区(bss段)

int t = 0; // 初始化为0的全局变量——全局/静态存储区(bss段)

int d = 2; // 初始化的全局变量——全局/静态存储区(读写data段)

const int e =3; // const 全局变量——全局/静态存储区(只读data段)

int main() {
static int f = 4; // 初始化静态局部变量——全局/静态存储区(data段)
static int g; // 未初始化静态局部变量——全局/静态存储区(bss段)
int h = 5; // 初始化局部变量——栈
int i; // 未初始化局部变量——栈(值不确定)
const int j = 6; // const局部变量——栈

char *k = "123456"; //123456存储在常量区,k在栈上。

cout << "a: " << a << endl; // 全局或静态变量未初始化则默认值为0
return 0;
}
  1. static无论是全局变量还是局部变量都存储在全局/静态区域,在编译期就为其分配内存,在程序结束时释放,例如:a、b、f、g。

  2. const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放,例如:e;const局部变量存储在栈中,代码块结束时释放,例如:j。

  3. 全局变量存储在全局/静态区域,在编译期为其分配内存,在程序结束时释放,例如:c、d。

  4. 局部变量存储在栈中,代码块结束时释放,例如:h、i、j。

内存分区示意图:

我们说的data(初始化的段) bbs段(未初始化的段) 都是针对全局变量和静态变量来说的.

data又分为读写数据段(rw data) 和 只读数据段(ro data)

bbs是未初始化的全局变量和静态变量和 初始化为0 的全局变量和静态变量.

我们在函数里面的定义的局部变量(除static xxx)都是在stack or heap里面.

bbs段不影响a.out的大小,bbs段的数据用占位符标示而已,不在a.out里面.运行才产生.

stack heap也都是在运行的时候产生.

参考:

  1. https://blog.csdn.net/lxw907304340/article/details/79982824
  2. https://www.cnblogs.com/jcsu/articles/1051579.html
  3. https://www.polarxiong.com/archives/C-C-%E4%B8%AD%E5%B7%B2%E5%88%9D%E5%A7%8B%E5%8C%96-%E6%9C%AA%E5%88%9D%E5%A7%8B%E5%8C%96%E5%85%A8%E5%B1%80-%E9%9D%99%E6%80%81-%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F-%E5%B8%B8%E9%87%8F%E5%9C%A8%E5%86%85%E5%AD%98%E4%B8%AD%E7%9A%84%E4%BD%8D%E7%BD%AE.html
喜欢你就打赏一下