C内存的分区

1. 内存:物理内存与虚拟内存

  • 物理内存:即计算机的实际RAM(随机存取存储器),是实实在在存在的硬件设备,用于存储运行中的程序和数据。
  • 虚拟内存:是操作系统使用的一种内存管理技术,它将物理内存和硬盘上的部分空间结合起来,形成一个更大的、统一的内存地址空间。当物理内存不足时,操作系统会将部分数据交换到硬盘上,从而腾出物理内存空间供其他程序使用。

在32位系统中,每个进程的寻址范围通常是4GB(从0x000000000xFFFFFFFF)。这是因为32位地址总线可以寻址的最大范围是2^32个地址,每个地址通常对应一个字节,因此总容量是4GB。然而,这并不意味着每个进程都能使用完整的4GB内存,因为操作系统和其他进程也需要内存。

2. 虚拟内存分区

当程序运行时,操作系统会将虚拟内存划分为不同的区域,以便更有效地管理内存资源。

2.1. 堆(Heap)
  • 用途:动态内存分配区域。程序在运行时可以使用如mallocnew等函数或操作符在堆上申请内存。
  • 特性:堆的大小在程序运行时是可变的,可以根据需要增长和收缩。由于堆内存是由程序员显式管理的,因此如果不正确释放已分配的内存,可能会导致内存泄漏。
2.2. 栈(Stack)
  • 用途:存储局部变量和函数调用的信息(如返回地址、参数等)。
  • 特性:栈是后进先出(LIFO)的数据结构。当函数被调用时,会在栈上分配空间来存储局部变量和调用信息;当函数返回时,这些空间会被自动释放。栈的大小通常是固定的,但可以通过编译器或操作系统的设置进行调整。
2.3. 静态全局区
  • 用途:存储静态变量和全局变量。
  • 细分
    • 未初始化的静态全局区:存储未初始化的静态变量和全局变量。这些变量在程序开始运行时被初始化为默认值(通常是0或空指针)。
    • 初始化的静态全局区:存储已赋初值的静态变量和全局变量。这些变量的值在程序开始运行前就已经确定。
2.4. 代码区(Text Segment 或 Code Segment)
  • 用途:存储程序的二进制代码,即机器指令。
  • 特性:代码区是只读的,以防止程序意外地修改其指令。当程序被加载到内存中时,代码区的内容会被复制到物理内存中,并由CPU执行。
2.5. 文字常量区(Literal Pool 或 Constant Pool)
  • 用途:存储字符串常量和其他编译时常量。
  • 特性:文字常量区存储的是常量的引用或实际值,这些值在程序运行时是不可变的。当程序中引用一个字符串常量时,如果该常量已经在文字常量区中存在,则不会创建新的副本,而是返回对该常量的引用。这有助于节省内存空间。

了解这些内存分区有助于程序员更好地理解和管理内存资源,从而提高程序的性能和稳定性。同时,也有助于避免常见的内存相关错误,如内存泄漏、野指针等。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值