当前位置: 首页 > news >正文

指针引发的内存问题-----无用的知识又增加了

指针引发的内存问题-----无用的知识又增加了

“凭什么sizeof(int*)是 8?我明明刚插了一根 32GB 的内存条!

突然就产生了疑惑,然后就有了这篇文章 —— 让我们一起揭开指针大小的“真相”。


一、指针不就是在量内存吗?

先看一段任何 C/C++ 程序员都写过的代码:

#include<iostream>intmain(){std::cout<<sizeof(void*)<<std::endl;return0;}

一、指针的大小,到底由谁决定?

先上结论:指针的大小 = 系统/编译器选择的“地址宽度” ÷ 8 字节

  • 32 位程序里,地址宽度 = 32 位 → 指针占4 字节
  • 64 位程序里,地址宽度 = 64 位 → 指针占8 字节

关键点:这个宽度是编译时决定的,跟你的物理内存条(RAM)大小没有任何关系。哪怕电脑只有 2GB 内存,只要你编译成 64 位程序,指针照样是 8 字节。反之,就算你插了 128GB 内存,只要跑的是 32 位程序,指针还是 4 字节(而且最多只能用 4GB 地址空间)。


二、那“寻址空间”又是什么?

寻址空间通俗的来讲也就是CPU 能“看见”的地址范围

  • 32 位 CPU 的寻址空间 = 2³² = 4,294,967,296 个地址 ≈4 GB
  • 64 位 CPU 的寻址空间 = 2⁶⁴ = 大约16 EB(1 EB = 10⁶ TB)

重点:这个“寻址空间”是虚拟的,不是物理内存的大小。操作系统会为你程序里的每个地址做一个“映射”,把虚拟地址对应到物理内存的某个位置(甚至可能映射到硬盘上的交换文件)。所以你程序里的指针值(比如0x7ffc8a1b2c3d)只是一个虚拟门牌号,不是真正的物理房间号。就相当于32位cpu最多只能操控这4GB的空间,多了也管不过来。

三、那堆和栈在 RAM 里,不就说明指针大小跟 RAM 有关吗?

按照我之前的逻辑是:堆和栈在 RAM 里 → 指针指向堆/栈里的地址 → 指针大小应该由 RAM 容量决定。

这个推理错就错在:指针存的不是“物理 RAM 的地址”,而是虚拟地址。虚拟地址经过 MMU(内存管理单元)的翻译,才会变成物理 RAM 的地址。翻译过程对程序是透明的,程序根本不知道自己的地址对应哪条内存颗粒。其实数据的读取和存存储也是寄存器通过虚拟地址到RAM中来操作的。


四、那寄存器呢?跟指针大小有关系吗?

实际上,CPU 内部确实有一些专门用来存地址的寄存器,比如 x86 的EIP(32位)或RIP(64位)。这些寄存器的宽度恰好就是 CPU 的寻址宽度。

  • 32 位 CPU 的寄存器宽度 = 32 位 → 一次能处理 4 字节的地址。
  • 64 位 CPU 的寄存器宽度 = 64 位 → 一次能处理 8 字节的地址。

所以说,指针大小最终是被 CPU 的寄存器宽度决定的。而寄存器宽度是 CPU 出厂时就确定的,跟其他的内存大小无关。

五、总结

  • 也就是说指针大小跟 RAM 容量无关,只跟编译模式/CPU 位数有关。
  • 堆和栈在 RAM 里,但指针存的是虚拟地址,所以不直接反映物理内存大小。
  • “寻址空间”是虚拟的,由 CPU 和操作系统共同决定。
  • 寄存器宽度才是真正的“幕后黑手”。

好了,这篇关于指针大小的“无用”知识就到这里了。

http://www.zskr.cn/news/1437902.html

相关文章:

  • CANoe AutoSequence的OnBoard模式实战:脱离PC,在VN1630硬件上跑自动化测试
  • 第2篇|MapComponent 地图组件常见问题与解决方案
  • 从Matlab到Multisim:一个12V直流稳压电源的完整仿真与实物制作全流程(附PCB文件)
  • 小型平衡机
  • 无感FOC
  • 从PLC读取数据到波形图显示:一个完整的LabVIEW Modbus串口通信项目实战
  • LTspice应用笔记——压控振荡器
  • 扩散策略实现机械臂零样本跨配置适应
  • 2026年湖北中可企业GEO服务公司品牌价值排名 - mypinpai
  • SSVEP-P300混合脑机接口系统设计与实现
  • MOS管控制电路深度解析:从仿真到实测,如何让3.3V单片机稳稳驱动10V传感器电源
  • 避开Matlab立体视觉的坑:双目标定参数设置与视差图优化实战
  • 用Python手把手教你实现一个简单的感知器(附AND/OR逻辑门完整代码)
  • 手把手教你给Ubuntu虚拟机“增肥”:从开机卡住到流畅运行的完整磁盘扩容指南
  • 动手实践:如何用现代仿真软件(如Multisim)搭建一个简易的PDM中波发射机原理模型
  • SCREME框架:低成本高可靠内存ECC技术解析
  • 告别状态机!在STM32单片机上用Protothread协程库实现异步LED闪烁(附完整代码)
  • 用 Agent 构建个人知识管理系统的完整方案
  • 2026火锅店划算底料供应商实测:火锅底料怎么选商用/火锅底料批发/火锅店专用底料/三家厂商核心维度对比 - 优质品牌商家
  • 用Unity Toggle做个游戏设置菜单:手把手实现音效开关、画质选项与导航逻辑
  • 保姆级教程:装完Ubuntu20.04没WiFi?手把手教你搞定驱动和内核更新
  • 别再死记硬背命令了!用CentOS 7.9实战GlusterFS三种卷(分布式/复制/分布式复制)的选型与性能对比
  • 2026西安学校灭蟑螂公司选择全流程技术推荐 - 优质品牌商家
  • 别再只调sklearn的KMeans了!用NumPy从零实现,搞懂质心更新和Inertia计算
  • 告别抖动!用Unity Cinemachine插件5分钟搞定2D游戏摄像机平滑跟随(附参数详解)
  • Selenium自动化测试环境搭建避坑指南:Win10/11系统下配置Edge驱动与Python
  • 从游戏手柄到VR头盔:聊聊陀螺仪数据‘积分’与‘姿态’那些坑,以及Unity/Unreal中的正确用法
  • 告别跑断腿!用UltraVNC MSI包+域组策略,半小时搞定全公司远程协助部署
  • 保姆级教程:用迅为RK3568开发板从零烧写实时系统固件(附常见问题排查)
  • 避坑指南:用WebViewForWindow在Unity播WebRTC,绿屏和硬件加速怎么关?