C++内存空间

内存空间

1.内存空间

在 C++ 中,内存分为内核空间和用户空间,内核空间由操作系统管理,程序员写的程序在用户空间。

程序运行时,内存主要分成四个区,分别是栈、堆、数据段和代码段。

栈:存储局部变量、函数参数和返回值。
堆:存储动态开辟内存的变量。
数据段:存储程序中的全局变量和静态变量。
代码段:存储可执行程序的二进制代码和常量(例如字符常量),程序运行后,此代码段的内容是不可修改的。

数据段:一个程序中的全局变量和静态变量一般使用较少,不做过多展开。

重点关心栈和堆,程序处理的数据主要存放在这两个区域中。

栈:存储局部变量、函数参数和返回值
堆:存储动态开辟内存的变量

2.栈和堆的主要区别

1)管理方式不同:栈是系统自动管理的,在出作用域时,将自动被释放;
堆需要程序员手动释放,若程序中不释放,程序结束时由操作系统回收。
2)空间大小不同:堆内存的大小受限于物理内存空间;而栈就小得可怜,一般只有8M(可以修改系统参数,但是没有必要)。当内存越大,堆分配的空间也就越大。
3)分配方式不同:堆是动态分配;栈有静态分配和动态分配(都是自动释放)。
4)分配效率不同:栈是系统提供的数据结构,计算机在底层提供了对栈的支持,进栈和出栈有专门的指令,效率比较高;堆是由C++函数库提供的。栈的效率非常高,堆是用链表来管理的,效率相对来说,会低一点。
5)是否产生碎片:对于栈来说,进栈和出栈都有着严格的顺序(先进后出),不会产生碎片;而堆频繁的分配和释放,会造成内存空间的不连续,容易产生碎片,太多的碎片会导致性能的下降。
6)增长方向不同:栈向下增长,以降序分配内存地址;堆向上增长,以升序分配内存地址。

3.变量的存储类别

变量的作用域和生命周期作用域:变量的作用范围(在何处能够访问到变量)

全局变量:定义在所有函数之外的变量,定义之后,都可以访问,而且数据共享(内存只有一块)。
注意:全局变量即使不赋初始值,会自动初始化为0

作用域 从定义开始到程序执行结束
局部变量 在函数或者代码块里面定义的变量,从定义开始到函数或者代码块结束;局部变量默认就是auto 表示由编译器自动释放内存

4.生命周期

自动变量 没有任何存储类别修饰的变量,都是自动变量(auto)
静态变量 用static修饰的变量,就是静态变量。不会自动释放内存,而是程序结束之后,操作系统自动回收。
注意:静态变量即使不赋初始值,会自动初始化为0
注意:加了static,就像吃了长生不老药,生命周期延长了,但是作用域不变

register 表示把变量放到寄存器(CPU)里面,注意:这个只是说给编译器建议,但是编译器不一定会采纳
extern 表示外部变量,这个一般用在多文件中
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

static–静态变量

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love coldplay

你的鼓励,将让我持续更新

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值