当前位置: 首页 > 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.cnnetsun.cn/news/2681327.html

相关文章:

  • C语言内存分配,栈区、堆区、全局区、常量区和代码区都是什么
  • Cortex-A7 L2缓存电源管理机制与优化策略
  • VMware虚拟机里给正点原子ATK-DLRK3568烧录镜像,保姆级避坑指南(Ubuntu 20.04)
  • Skill 是什么?——AI Agent 的“技能包“
  • 通达信.lc1文件格式全解析:从二进制字节到可读的K线数据(Python/Pandas实战)
  • 从零到一:用PX4的uORB机制实现一个自定义消息(保姆级教程)
  • 基于C++实现(控制台)学生选课系统
  • UE5 GAS实战:别再直接扣血了!用Meta Attributes和Set by Caller重构你的RPG伤害系统
  • 别再只用NTP了!手把手教你用LinuxPTP(ptp4l)实现微秒级时间同步
  • Unity3D内嵌网页开发避坑:用ZFBrowser插件搞定PC端,解决打包后网页不显示和中文输入问题
  • 别再死记硬背了!一张图看懂阻尼比ζ如何决定振动系统的‘命运’
  • MATLAB图像质量评估工具:一键算SNR和PSNR,带示例图与说明文档
  • 4款免配置HTML大屏模板:ECharts图表+数字字体+全屏动效一键预览
  • ICStudio工控组态源码包:Qt5.13开发,支持Modbus通信、双模式运行与插件化扩展
  • 从混乱CSV到规整文件夹:一个脚本搞定Mini-ImageNet数据预处理(含百度网盘资源)
  • 如何用Blender3mfFormat插件打通3D打印全流程?
  • 指令制导与制导雷达的角色
  • 告别切图!用BMFont+Unity自制游戏专属字体,从导入图片到生成.fnt文件全流程
  • 手把手教你为Ubuntu 22.04编译安装蓝牙驱动(解决5.15/5.17/5.18内核蓝牙失灵)
  • 别再死记公式了!用Python手撸一个LDA分类器,从鸢尾花数据集开始
  • MATLAB噪声调频干扰信号生成与频谱特性仿真工具包
  • 在Ubuntu 22.04上从零搭建TrinityCore 3.3.5服务器:一份保姆级避坑指南
  • AI 日报 | 2026年5月31日:谷歌 I/O 炸场、Anthropic 估值9000亿、大模型进入“价值验证之年“
  • Qt5.15.2 + MinGW64 编译的 OpenCV 4.5.3 动态库全集(含头文件、CMake配置、分类器与示例程序)
  • 避坑指南:TurtleBot3仿真建图时,Gazebo卡顿、地图不闭合?可能是这些细节没做好
  • 即将2027年了,为什么还都在推荐学习Python编程语言
  • 基于门控Transformer的多维时序分类PyTorch实现,含训练推理脚本与注意力/聚类可视化
  • MATLAB版GA-PSO混合优化代码包:含交叉选择机制、双测试数据与详细中文使用指南
  • 【JavaWeb】HTML+CSS 零基础入门详解
  • 产品经理向上管理实战指南:从“背锅侠“到“职场赢家“的进阶之路