杂七杂八
一、内存
一、物理及虚拟内存地址
程序在访问一个内存地址指向的内存时,CPU不是直接把这个地址送到内存总线上,而是先通过MMU(负责虚拟地址转换为物理地址),把内存地址映射到实际的物理内存地址上,然后再通过总线去访问内存,程序操作的地址称为虚拟内存地址。
二、用户和内核空间
内存中有一部分分配给内核使用,一部分分配给应用程序使用,分别称为内核空间和用户空间。
三、栈内存和堆内存
程序一般放在ROM(只读内存)中,运行时需要拷贝到RAM(随机存储器RAM)中执行,RAM会分别存储不同的信息,如下:
内存中的栈区处于相对较高的地址以地址的增长方向为上的话,栈地址是向下增长的。栈中分配局部变量空间,堆区是向上增长的用于分配程序员申请的内存空间。另外还有静态区是分配静态变量,全局变量空间的;只读区是分配常量和程序代码空间的;以及其他一些分区。
栈的空间是系统自动分配的,也会自动回收,如:定义一个变量;而堆空间需要程序员自己申请,需要自己手动去释放。
栈数据的生命周期只在函数运行过程中,运行之后就会释放掉,而堆上的数据只要程序员不是放就能一直访问到。说到这里可以额外说一下基本数据类型和引用数据类型:
基本数据类型保存在栈内存中,而变量可以看作是这块内存的标记;程序定义的变量名称,编译时会通过这个名称来找到值,当基本类型变量作为参数传递时,传递的是值的副本,而非本身引用,基本数据类型就是常见的数据类型,如:整形,字符型,布尔型等等。引用数据类型在内存中不直接存储数据值,而是存储数据值的引用地址,即指向这些值在堆中存储位置的指针,引用数据类型可以认为变量名在栈内存中,值在堆内存中,引用数据类型有类、接口、数组、枚举等。
上面说到了指针,指针是一个特殊的变量,里面存储的数值被解释为内存里的一个地址,也可以理解为内存会划分出小的内存单元,每个内存单元都有一个编号,这个编号被称为地址,这个地址也叫做指针,如下图。指针主要有四方面的内容,指针的类型、指针所指向的类型、指针本身所占据的内存区、指针所指向的内存区。
这里主要说明指针所指向的内存区。
指针所指向的内存区:指针的值是指针本身存储的数值,这个值会被编译器当成一个地址,指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区,我们说一个指针的值是XX,就相当于说该指针指向了以XX 为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
为什么有变量还要指针呢,那是因为变量的再重复操作是不可能避免的会出现擦除和新建,造成资源的浪费,但是指针是对同一块内存进行修改的,免去了这个过程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义