C/C++代码的内存分布

1. C代码的内存分布

一个程序本质上都是由 BSS 段、data段、text段三个组成的。C代码在运行装入内存时会增加栈和堆。
C代码的内存分布:

说明
由编译器在需要时分配,在不需要时自动清除,通常是局部变量、函数参数等
由程序员自己申请(malloc)和释放(delete)的内存,如果没有释放,程序结束后,可能由操作系统释放
数据段 初始化的全局变量和静态变量,静态内存分配
BSS段 未初始化的全局变量,静态内存分配
代码段 存放的是程序代码,也可能存放一些只读的常量,如字符串常量等

/*全局变量,项目中的所有文件都可以使用这个变量,但外部文件使用前要加extern声明*/
int a = 1;

/*静态全局变量,具有文件作用域,即该变量只能在当前文件的任意位置使用*/
static int b;

void func(){
	/*局部变量,是在函数体内定义的变量(包括main,各函数同名的局部变量并无影响),
	只在函数执行期间存在,在函数调用结束之后变量会被撤销,其所占的空间也会被释放。*/
	int c=1;

	/*静态局部变量,只被初始化一次,直到程序结束之前都会一直存在。但是只能被定义自
	己的函数一直可见*/
	static int d=2;
}

此外,对于全局变量和static修饰的静态变量,如果不赋初值,编译时自动为该变量赋值为0。

2. C++内存分布

基本上和C是差不多的,但有些变化

说明
由编译器在需要时分配,在不需要时自动清除,通常是局部变量、函数参数等
由程序员自己申请(malloc)和释放(free)的内存,如果没有释放,程序结束后,可能由操作系统释放
全局/静态存储区 初始化的和未初始化的全局变量和静态变量都在这一块,C是分开的,C++将其放在同一块
自由存储区 程序员使用操作符new(delete)申请(释放)的内存
常量存储区 存放的是只读的常量

说明:
new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。
那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章