C++的内存分配

这里简单记一下,以防自己忘了。

C++的内存结构分为以下5种:

  • 栈区(Stack)
  • 堆区(Heap)
  • bss段
  • data段(又叫GVAR)
  • text段

网上的文章说法有两种,另外一种的结构为:

  • 自由存储区(free store)
  • 全局/静态存储区
  • 常量存储区

上述的分类方法,其中强调了堆内存的生成使用malloc,而自由存储区(free store)使用new。这两种结构的分类网上的说法不一,但实际应该考虑C++的编译、运行环境来决定,因为C++的语言标准并没有决定堆、栈已经内存存储结构等概念。但一般来说,系统对于C++赋予的内存结构都是有堆和栈的,其余的结构用于存储我们日常不太关心的内容。

相关资料参考:

如图:

而内存的分配又分为两种:

  • 静态分配
  • 动态分配

内存结构

栈区(Stack)

在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限,其内存增长方式按内存地址由高到低方向生长,属于动态分配内存

堆区(Heap)

堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,按内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大,一般由malloc、new创建,属于动态分配内存

每个线程都会有自己的栈,但是堆空间是共用的

bss段

BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是:可读写的,在程序执行之前BSS段会自动清0。所以,未初始的全局变量在程序执行之前已经成0了,属于静态分配内存

bss的例子:https://blog.csdn.net/zhengxianghdu/article/details/9022867

data段(又叫GVAR)

有的地方叫GVAR(global value),用来存放程序中已经初始化的非零全局变量。其中data有分为可读写区域和只读区域:

  • 读写区域(RW):存放非零全局变量、静态变量
  • 只读区域(RO):存放常量

属于静态分配内存

text段

也称为代码段(Code),用来存放程序执行代码,同时也可能会包含一些常量(如一些字符串常量等)。该段内存为只读区域,并且为共享的,当有多个相同进程(Process)存在时,共用同一个text段。

下面代码简单描述一下变量各自存储的内存区间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int gValue;//未初始化的全局变量,存放在bss
int gValue1 = 1;//已初始化的非0全局变量,存放在rwdata
static int sValue;//未初始化的静态全局变量,存放在bss
static int sValue1 = 2;//已初始化的静态全局变量,存放在rwdata
static int sValue2 = 0;//初始化为0的静态全局变量,存放在bss
const int cValue = 1;//存放在rodata

int main(){
int a;//栈
char s[] = "abc";//栈
char *p1;//栈
char *p2 = "abcdef";//p2在栈,"abcdef"在rodata上

static int lValue = 4;//存放在rwdata

*p1 = (char *)malloc(10);//malloc分配的内存在堆上
strcpy(p1, "123456");//"123456"存放在rodata上

return 0;
}
C++中的顶层const 关于取模运算和取余运算

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×