C++学习笔记 —— 内存模型(变量存储位置)

分层概述

一、栈:

通常是局部变量,函数参数等的存储区。声明为static的局部变量除外

二、堆:

动态分配的内存。像new和malloc就在该区域上申请内存空间。该区域内存的管理必须由程序写作者来负责,也就是如果通过new或malloc申请了一块内存,在程序结束时必须通过delete或free来释放相应的内存。new和delete的内容我后面会仔细说明。

因为该区域可以由用户来申请,申请大小视情况而定,通常很不一致,所以很容易造成该区域内存的碎片化。

三、全局区(静态区)

编译器编译时即分配内存。

  • bss: 该区域存放未初始化的 全局变量和被声明为static的局部变量。。bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。
  • data: 存放已经初始化的 全局变量和被声明为static的局部变量

四、常量存储区

  • rodata
    常量字符串就是放在这里的。 程序结束后由系统释放。其中rodata区和text区在加载时会合并到一个段中,该段称为常量区,该区域的内容只允许读,不允许修改;
  • text:
    也称为代码段(Code),text区保存程序编译链接后生成的机器代码。

举例详述

#include<iostream>

using namespace std;

const double pi=3.1415926;    //常量: 存储在常量区

static int out=0;    //静态全局变量: 已初始化,data区

int i=1;    //初始化了的全局变量:已初始化,data区

int j;    //未初始化的全局变量:未初始化,bss区

void func1()
{
    
    
	static int count;    //静态局部变量:未初始化,bss区

	count++;

	int i=count % 10;    //局部变量:栈

	cout<<"count % 10="<<i<<endl;    //"count % 10="为字符串常量:常量区
}

void func2()
{
    
    
	int i=0;    //局部变量:栈
	int *pi=&i;    //局部变量:栈
	*pi=*pi+1;
	cout<<"i="<<i<<endl;    //"i="为字符串常量:常量区
}

int main()
{
    
    
	static int out=2;    //静态局部变量:已初始化,data区

	cout<<"out="<out<<endl;

	func1();

	func2();

	return 0;
}

参考文章
http://vra.github.io/2015/01/25/cpp-memory-mode/

猜你喜欢

转载自blog.csdn.net/chongbin007/article/details/106414190