关于计算机:64位平台下指针自身的大小为什么是8字节

7次阅读

共计 1290 个字符,预计需要花费 4 分钟才能阅读完成。

系列导读

本系列基于 64 位平台、1Page=8KB

明天咱们开始拉开《Go 语言轻松系列》第二章「内存与垃圾回收」的尾声。

对于「内存与垃圾回收」章节,大体从如下三大部分开展:

  • 常识准备:为后续的内容做一些常识储备,常识准备包含

    • 指针的大小
    • Tcmalloc 内存调配原理
  • Go 内存设计与实现
  • Go 的垃圾回收原理

本篇前言

第一局部 常识准备 的第一个知识点 指针的大小

为什么 指针的大小 会作为一个知识点呢?

因为后续内存治理的内容会波及一些数据结构,这些数据结构应用到了指针,同时存储指针的值是须要内存空间的,所以咱们须要理解指针的大小,便于咱们了解一些设计的用意;其次,这也是困扰我的一个问题,因为有看见 64 位平台下指针底层定义的类型为uint64

为了搞清楚这个问题,咱们须要理解两个知识点:

  1. 存储单元
  2. CPU 总线

什么是存储单元?

存储单元是存储器 (本文指内存) 的根本单位,每个存储单元是 8bit,也就是 1Byte,如下图所示:

同时从上图中咱们能够看出,每个存储单元会被编号,这个编号又是什么呢?

  • 就是咱们通常所谓的“内存的地址”
  • 也就是指针的值

论断:指针的值就是存储单元的编号。

接着,咱们只须要晓得这个「编号」的最大值是多少,就能够晓得存储「指针」的值所需的大小。要找到这个最大值就须要理解 CPU 总线 的常识了。

CPU 总线的概念


CPU 总线由系统总线、等等其余总线组成。

总线的组成
系统总线
等等其余总线 …

系统总线由一系列总线组成。

系统总线的组成
地址总线
数据总线
信号总线

内存的地址 (存储单元的编号) 是通过 地址总线 传递的,地址总线里的“每一根线”传递二进制 01,如下图所示(理论不是这么简略,图示为了便于大家了解)。

地址总线的 宽度 决定了一次能传递多少个 01,因为 64 位 CPU 每次可解决 64 位数据,所以实践上地址总线的宽度能够反对到最大 64,也就是 2^64 种组合,可代表的数字范畴为0 ~ 2^64-1

论断:实践上 64 位 CPU 地址总线可传输的 10 进制数范畴为0 ~ 2^64-1

下面晓得 64 位 CPU 的地址总线可寻址范畴 为 0 ~ 2^64-1,须要一个类型能够存储这个指针的值,毫无疑问就是 uint64uint64 又是多大呢?是不是 8byte。所以:64 位平台下,一个指针的大小是 8 字节

顺便裁减个问题:

为什么 32 位平台下,可寻址空间是 4GB?

备注:64 位太大,咱们这里用 32 位来看这个问题

咱们来剖析一下:

  • 因为,32 位平台可反对地址总线的最大宽度为 32,及代表的存储单元编号的范畴:0 ~ 2^32-1
  • 则,最多能够找到 2^32 个存储单元
  • 又有,存储单元的大小为 8bit(1Byte)

所以咱们能够失去,32 位平台最多能够寻找到 2^32 个存储单元,再翻译下2^32 个存储单元 这句话:

2^32 个存储单元 == 2^32 个 1Byte == 2^32Byte == 4GByte == 4GB

做个总结哈

咱们回头再来看,本次内容能够 get 到如下知识点:

  • 存储器的根本单位是存储单元
  • 存储单元为 8bit
  • 指针的值就是存储单元的编号
  • CPU 地址总线的宽度决定了指针的值的最大范畴

查看《Go 语言轻松系列》更多内容

链接 http://tigerb.cn/go/#/kernal/

正文完
 0