内存分区问题

文章详细介绍了C++中的四种存储类型:自动存储(如栈上的变量)、静态存储(全局变量和static修饰的变量)、动态存储(new/delete管理的堆内存)以及C++11引入的线程存储。此外,还讨论了存储持续性、作用域和链接性的概念,包括局部变量、静态变量、堆内存以及内存的分区如全局区、堆区、栈区等。
摘要由CSDN通过智能技术生成

1、自动存储、静态存储和动态存储

(第四章内容)4.8.5
自动存储:用时创建,结束时销毁。一般存储在栈区。在c语言和C++11之前,auto关键字表示变量为自动存储类型,auto可缺省。在C++11新标准中,auto的意思改为了“自动推导变量类型”。

静态存储:变量定义在函数外,或者用static关键字修饰时为静态存储。在c语言古老版本中,智能初始化静态数组和静态结构,在C++Release2.0及以后和ANSI C中,也可以初始化自动数组和自动结构。

动态存储:用new/delete来管理堆区空间。

(第九章内容)9.2

2、存储持续性、作用域和链接性

注意,C++使用三种不同的方案来管理存储数据,这些方案的区别就在于数据保留在内存中的时间。但是在C++11新标准中,新增加了一种“线程存储持续性”:当前,多核处理器很常见,这些CPU可同时处理多个执行任务。这让程序能够将计算放在可并行处理的不同线程中。如果变量是使用关键字thread_local 声明的,则其生命周期与所属的线程一样长。本书不探讨并行编程。

自动存储持续性:C++中有两种存储持续性为自动的变量:auto自动变量(栈)和寄存器变量(register)。不过register也只是建议编译器将这个变量存储在cpu的寄存器中,以提高对变量的访问速度,但具体是否实现有编译器决定。

静态存储持续性:C++为静态存储持续性提供了3种链接性:外部链接性(可在其他文件中访问)、内部连接性(只能在当前文件中访问)、无连接性(只能在函数或当前块中访问)。这些变量在程序执行期间一直存在。

原文:

参考:C++ Primer Plus第9.2章的内容和[CSDN](https://blog.csdn.net/EJoft/article/details/122703902)
C++为在内存中存储数据提供了多种选择,可以选择数据保存在内存中的时间长度(存储持续性 storage duration)以及程序哪一部分可以访问数据(作用域 scope 和链接 linkage)

C++中有四种不同的方案来存储数据,这些方案的区别就在于数据保留在内存中的时间

**自动存储持续性(Automatic Storage Duration)**在函数定义中声明的变量(包括函数参数)在存储持续性上是自动的。它们在程序开始执行其所属的函数或者代码块时被创建,在执行完函数或代码块时,他们使用的内存被释放。C++有两种存储持续性为自动的变量:自动变量和寄存器变量。
静态存储持续性(Static Storage Duration):在函数定义外定义的变量和使用关键字 static 定义的变量。它们在程序运行的运行的整个过程中都存在,C++有三种该变量。
线程存储持续性(C++11 Thread Storage Duration):多核处理器很常见,这些CPU能同时处理多个执行任务,这让程序能将计算放在可并行处理的不同线程中。如果变量用 thread_local 声明,那么其生命周期和所属的线程一样长。
动态存储持续性(Dynamic Storage Duration):用 new 运算符分配的内存将一直存在,直到使用 delete 运算符将其释放或程序结束为止,有时被称为 自由存储 (free store)或 堆 (heap)

表格总结:
图1
图2

参考CSDN

3、C/C++内存分区

局部变量:栈(即:我们常说的堆栈)
static变量:数据区、data区和.bss区
静态局部变量和全局变量:静态存储区
常量:位于常量区,ro.data区

堆:一种内存管理机制,通过malloc、calloc或realloc申请内存,free释放内存(new/delete)
以下图片来源于《嵌入式linux与c语言内核》P92左右:
图1
图2
图3

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

程序的内存五区:

全局区(静态数据区),存放全局变量、静态变量。初始化的
全局变量和静态变量在一块区域.Data段, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域.bss段。 程序结束后由系统释放。注意,显式初始化的全局变量和静态变量存放在.Data段,未显式初始化的变量存放在.bss段,并由编译器自动初始化为0。
堆,程序员管理。
栈,存放程序局部变量。
文字常量区:—常量字符串就是放在这里的。 程序结束后由系统释放。还有const关键字修饰的值也是存放在此。
代码区.text: 存放函数体的二进制代码

还有一种内存四分区: 将全局(静态)变量和常量结合到一起,归结为“数据区”。
栈区: 系统使用
堆区: 程序员使用
数据区: 由全局变量/静态变量(.Data段和.bss段)和常量组成。
代码区(.text):存放函数的二进制代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值