C++内存分区讲解(_杰森大师)

13 篇文章 0 订阅

C++的内存分区

1.代码区(code area)

2.静态/全局数据区(data area)

3.栈区(stack area)

4.堆区(heap area)

5.常量存储区(constant area)

最容易理解的方式和你们说明这几个东西的意义:

代码区:你们放置函数体的二进制代码

静态/全局数据区:由static修饰的变量和函数体“外”创建的变量

(其中这两者都是在程序运行前就有的,就在程序exe里面的二进制)

栈区:存放函数的参数值,局部变量都是存放在栈区,栈区默认2mb大小

堆区:创建new()或者malloc()新的内存地址的都是存放堆区,默认为2GB以下

(这两者是在程序运行后就有的,这两个你可以用反编译去看到他们的内存地址)

常量存储区:存放的是常量,是不允许修改的,就是说用const修饰的值

自己记住内存分区可以这样,例如:

// rand.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

using namespace std;

inline int*a(int s,int x) { return &s ; }//内联函数不调用栈,只复制return s+10的代码

static int numbers = 10;//静态数据区;
const int s = 10;//常量数据区
int numberss = 100;//全局数据区

int aa(int as)//函数在代码区
{
	return as;//形参和返回值为栈区分配的内存空间
}

int main()
{
	int*aaa=new(int);//函数的成员变量都在栈区 ,而new后的为堆区的,其中堆区的大小为2GB以下,就是2*1024*1024*1024
	int*a = (int*)malloc(10);//malloc后的为自由存储区的值
	int s;//局部变量都在栈中,其中栈在window中默认是2MB。就是2*1024*1024的大小

	for (int i=0;i<100;i++)
	{
		cout << 100+rand()%(1000-100)+ rand() % 10 / 10 << endl;
	}
}

这样更好进行理解

如果你先反编译的话可以点击右键F9然后开始调试,再右键反编译就可以看到汇编代码和内存地址
在这里插入图片描述
在这里插入图片描述

内存分区现况

在这里插入图片描述
一个程序的3个基本段:text段,data段,bss段

text段在内存中被映射为只读,但date段与bss段是可写的
text段:代码段,就是放程序代码的,编译时确定,只读
date段:存放在编译阶段(而非运行时)就能确定的数据,可读可写。也就是通常所说的静态存储区,赋了初值的全局变量和赋初值的静态变量存放在这个区域,常量也存在这个区域
bss段:已经定义但没赋初值的全局变量和静态变量存放在这个区域。

两者之间区别是:代码段,数据段,堆栈段是cpu级别的概念,五大分区属于语言级别的概念,两者是不同的概念。

存储类型关键字定义变量与函数作用域与生命周期
在这里插入图片描述

auto变量:函数的局部变量,如果没有声明为static,函数中定义的局部变量全部为auto类型,auto变量包括未加static声明的局部变量和函数的形参。在函数调用时系统会给他们分配存储空间,在函数调用结束后会自动释放这些空间。属于动态存储方式。
static变量:用static声明的局部变量在调用结束后不会消失而保存原来的值。static局部变量定义使用后值会存储下来。所以使用static局部变量定义只需要一次赋值。静态局部变量的作用域仅限于所定义的函数。但函数结束后变量的值会保留。直到整个程序运行结束。全局变量从定义开始作用于整个文件直至程序运行结束。
register寄存器变量:寄存器变量可以提高c语言的执行效率,即将局部变量的值存入CPU的寄存器中。需要注意的是!!!:1.只有动态存储的变量(自动局部变量和形参)才可以作为寄存器变量来存储,局部静态变量不可以定义为寄存器变量。2.计算机的寄存器数目是有限的,所以不能定义任意多个寄存器变量。
extern外部变量:即全局变量的外部表现形式,是在函数外部定义的变量。全局变量的作用域为从定义开始到源文件结束。exten对该变量作外部变量声明,扩展变量作用域。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值