前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >64位平台下,指针自身的大小为什么是8字节?

64位平台下,指针自身的大小为什么是8字节?

作者头像
用户1093396
发布2021-02-05 14:10:02
6540
发布2021-02-05 14:10:02
举报

系列导读

代码语言:javascript
复制
本系列基于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?

代码语言:javascript
复制
备注: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地址总线的宽度决定了指针的值的最大范围

预告


下篇文章我们将带来知识预备的第二个知识点TCMalloc内存分配原理


Go轻松进阶系列 更多文章

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TIGERB的技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 系列导读
    • 什么是存储单元?
      • CPU总线的概念
      • 做个总结哈
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档