首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CPU是如何访问内存的?

CPU通过MMU访问内存 我们先来看一张图: ? 从图中可以清晰地看出,CPU、MMU、DDR 这三部分在硬件上是如何分布的。...首先 CPU访问内存的时候都需要通过 MMU 把虚拟地址转化为物理地址,然后通过总线访问内存。...MMU 开启后 CPU 看到的所有地址都是虚拟地址,CPU 把这个虚拟地址发给 MMU 后,MMU 会通过页表在页表里查出这个虚拟地址对应的物理地址是什么,从而去访问外面的 DDR(内存条)。...所以搞懂了 MMU 如何把虚拟地址转化为物理地址也就明白了 CPU 是如何通过 MMU 来访问内存的。...CPU 访问的虚拟地址可以分为:p(页号),用来作为页表的索引;d(页偏移),该页内的地址偏移。

2.4K60

CPU是如何访问内存的?

CPU通过MMU访问内存 我们先来看一张图: ? 从图中可以清晰地看出,CPU、MMU、DDR 这三部分在硬件上是如何分布的。...首先 CPU访问内存的时候都需要通过 MMU 把虚拟地址转化为物理地址,然后通过总线访问内存。...MMU 开启后 CPU 看到的所有地址都是虚拟地址,CPU 把这个虚拟地址发给 MMU 后,MMU 会通过页表在页表里查出这个虚拟地址对应的物理地址是什么,从而去访问外面的 DDR(内存条)。...所以搞懂了 MMU 如何把虚拟地址转化为物理地址也就明白了 CPU 是如何通过 MMU 来访问内存的。...CPU 访问的虚拟地址可以分为:p(页号),用来作为页表的索引;d(页偏移),该页内的地址偏移。

3K40
您找到你想要的搜索结果了吗?
是的
没有找到

内存对齐

内存对齐应用于三种数据类型中:struct、class、union;为什么内存对齐:提高内存访问效率,减少cpu访问内存次数用sizeof运算符可以得到整个结构体占用内存的大小。...注意:整个结构体占用内存的大小不一定等于全部成员占用内存之和。内存对齐:#pragma pack(字节数) 如果用1,那么内存之间就没有空隙了合理使用内存对齐规则,某些节省内存的做法可能毫无意义。...位域:位域定义与结构体定义相仿,其形式为:struct 位域结构名{ 位域列表 }其中位域列表的形式为:type [member_name] : width;图片结构体内存对齐规则:1、首先看有没有...2) struct test{ int *a; char b; short c[20]; }图片但是当有了#pragma pack 宏定义后,不一定一定会按照宏定义的数值来进行内存对齐...;当结构体中的最大的数据类型的大小 小于 宏定义的大小时,就会以结构体中最大的数据类型的大小来进行内存对齐#pragma pack(8) struct test { char a; int

17740

内存对齐

内存对齐 内存 CPU要想从内存读取数据,需要通过地址总线,把地址传输给内存内存准备好数据,输出到数据总线 若是32位地址总线,可以寻址[0,2的32次方-1],占用内存4g 有些CPU是能够支持访问任意地址的...内存对齐的收益 提高代码平台兼容性 优化数据对内存的使用 避免一些内存对齐带来的坑 有助于一些源码的阅读 为什么对齐 列举一些常见的单位 位 bit 计算机内存数据存储的最小单位 字节 byte...,为了访问对齐内存,处理器需要作2次内存访问,而内存对齐就只需要一次访问 64位字的安全访问保证 在x86-32上,64位函数使用Pentium MMX之前不存在的指令。...为什么?...golangci-lint 检测对齐 golangci-lint run –disable-all -E maligned 结论 内存对齐是为了cpu更高效的访问内存中的数据 结构体对齐依赖类型的大小保证和对齐保证

64821

CPU角度理解Go中的结构体内存对齐

本文就从cpu读取内存的角度来谈谈内存对齐的原理。 01 结构体字段对齐示例 我们先从一个示例开始。T1结构体,共有3个字段,类型分别为int8,int64,int32。...03 struct字段内存对齐 了解了CPU内存读取数据是按块读取的之后,我们再来看看开头的T1结构体各字段在内存中如果紧密排列的话会是怎么样的。...所谓的数据对齐,是指内存地址是所存储数据大小(按字节为单位)的整数倍,以便CPU可以一次将该数据从内存中读取出来。 编译器通过在T1结构体的各个字段之间填充一些空白已达到对齐的目的。...没超过1个字长(8字节),但在内存中的分布是如下图这样: 我们发现b并没有直接在a的后面,而是在a中填充了一个空白后,放到了偏移量为2的位置上。为什么呢? 答案还是从内存对齐的定义中推导出来。...07 总结 本文从CPU读取内存的角度分析了为什么需要进行数据对齐。该文目的是为了让你更好的了解底层的运行机制,而非时刻关注结构体的字段顺序。在编写代码时顺其自然就好。

59720

GO 内存对齐

这不坑我么.内存占用直接多出一倍. 探索 通过查找资料, 发现了这样一个名词: 内存对齐. 什么是内存对齐呢?...简单说, 就是CPU在读取数据的时候, 并不是一个字节一个字节读取的, 而是一块一块读取的. 那么这个快是多大呢? 根据CPU位数不同而不同....结构体的对齐保证, 为其成员变量对齐保证的最大值. why 那么编译器为什么要做内存对齐这种事情呢?...举个例子, 如果不做内存对齐, 那么下面这个结构体的内存分布为: type Test struct { b bool i3 int32 } ABBB B 还记得之前说, CPU读取内存是一块一块读取的么...这样的话, 当你需要读取i3变量的时候, 需要进行两次内存访问. 而对齐之后, 只需要进行一次内存访问即可. 是典型的空间换时间的做法.

1.3K20

理解内存对齐

今天我们来学习一下内存对齐相关的知识点。关于内存对齐想必大家在编程中应该遇到过或在面试时也是经常被提及的。那么针对下面几个问题你真的都知道其中答案吗? 什么是内存对齐为什么内存对齐?...这个特定值被称为对齐边界,而按照这个规则进行数据存储的过程被称为内存对齐对齐的好处包括提高数据访问的速度和优化内存使用。...unsetunset2、为什么内存对齐unsetunset 上面提到了之所以内存对齐是因为内存对齐是操作系统的一种优化手段。 内存对齐是为了提高计算机系统的性能和效率。...性能提升: 内存对齐可以提高访问内存的效率。许多现代处理器在访问对齐内存地址时能够更快地执行读写操作,而访问对齐内存则可能需要额外的处理器开销。 原子性: 对齐的数据访问通常能够保证原子性。...在某些体系结构上,对齐内存访问可以保证在单个总线事务中完成,而未对齐内存访问可能需要多次总线事务,增加了访问的复杂性和开销。 硬件对齐限制: 一些硬件设备对数据的对齐有严格的限制。

12310

详解内存对齐

写在最后的一个知识点: 计算机中,最小的存储单元为字节,理论上任意地址都可以通过总线进行访问,每次寻址能传输的数据大小就跟CPU位数有关。常见的CPU位数有8位,16位,32位,64位。...何为内存对齐 以下内容来源于网络总结: 现代计算机中内存空间都是按照字节(byte)进行划分的,所以从理论上讲对于任何类型的变量访问都可以从任意地址开始,但是在实际情况中,在访问特定类型变量的时候经常在特定的内存地址访问...为何要有内存对齐 主要原因可以归结为两点: 有些CPU可以访问任意地址上的任意数据,而有些CPU只能在特定地址访问数据,因此不同硬件平台具有差异性,这样的代码就不具有移植性,如果在编译时,将分配的内存进行对齐...,这就具有平台可以移植性了 CPU每次寻址都是要消费时间的,并且CPU 访问内存时,并不是逐个字节访问,而是以字长(word size)为单位访问,所以数据结构应该尽可能地在自然边界上对齐,如果访问对齐内存...,处理器需要做两次内存访问,而对齐内存访问仅需要一次访问内存对齐后可以提升性能。

1K20

浅谈Golang内存对齐

当然,如果你以前没有接触过内存对齐的话,那么对你来说上面的内容可能过于言简意赅,在继续学习之前我建议你阅读以下资料,有助于消化理解: 内存布局 图解 Go 之内存对齐 Dig101-Go之聊聊struct...的内存对齐 在 Go 中恰到好处的内存对齐 Go 结构体的内存布局 Golang 是否有必要内存对齐 测试 我构造了一个 struct,它有一个特征:字段按照一小一大的顺序排列,如果不看注释中的 Sizeof...,struct 本身也要内存对齐。...为什么这样做?...如果你搞定了上面的问题,那么不妨再想想,为什么 groupcache 通过增加一个 _ int32 来实现 64 位对齐,而 sync.WaitGroup 却是通过运行时判断来实现 64 位对齐呢?

1.2K21

内存对齐(C++)

内存对齐的概念 引入代码 众所周知,C++的空类占用1个字节的内存空间,非空类占用的空间与类内的成员有关。...这是因为成员变量的存储并不是连续的,而是根据一定的块大小存储(一般默认为4),这就是所谓的内存对齐。...内存对齐的规则 对齐系数与有效对齐值 首先明确两个概念 对齐系数:每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。...4,但该类中最长数据类型char为1,所以有效对齐值为1,结果输出为3 内存对齐的具体规则为 第一个成员变量放在offset为0的地方,以后每个成员变量的对齐按照有效对齐值进行。...(即编译器只会按照1、2、4、8、16的方式分割内存,其他值无效) 图示 test的内存分配如下 如果把使用#pragma pack(n)把默认的对齐系数改为1,代码如下 #include<iostream

91220

Go内存对齐详解

比如 32 位的 CPU ,字长为 4 字节,那么 CPU 访问内存的单位也是 4 字节。这么设计的目的,是减少 CPU 访问内存的次数,提升 CPU 访问内存的吞吐量。...因为CPU内存的读取操作是对齐的,采用不对齐的存储方式,会导致为了读取一个数据CPU访问两次内存。...为什么内存对齐? (1) 平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。...举个栗子看下内存对齐对寻址效率的提升: 图中变量 A占据 4 字节的空间,变量B占据8字节空间,内存对齐后,CPU 读取变量 B 的值只需要进行一次内存访问。...如果不进行内存对齐CPU 读取变量B的值需要进行 2 次内存访问。第一次访问得到B的第4-7位置4 个字节,第二次访问得到变量B的8-11位置后4个字节。

2K41

结构体内存对齐

这就是结构体内存对齐。 定义: 结构体内存对齐是指创建结构体变量时,编译器会根据特定规则把内存会按照特定的规则分配空间以存储结构体的成员,以提高内存访问效率和性能。...这里就解释了,为什么S1的内存大小是8个字节而不是6个字节,因为结构体的内存分配中存在未被使用的地址空间。 三、内存对齐方式 我们虽然通过测试,明白了案例一的内存空间分配情况。...但是我们还是不知道为什么编译器会这样分配内存空间。 下面我介绍一下结构体内存对齐的规则: 第一个成员在与结构体变量偏移量为0的地址处。 其他成员变量要对齐对齐数的整数倍的地址处。...考虑第三个规则:结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。 四、为什么要引入结构体内存对齐?...提高访问速度: 对齐后的数据可以直接通过单个 CPU 指令来读取,而非对每个字节逐个访问,从而提高内存访问速度。

8310

IOS 内存对齐原理

,这就是ios 中内存字节对齐现象 内存对齐规则 每个特定平台上的编译器都有自己的默认"对齐系数",程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16 来改变这一系数,其中...,不足的需要补齐 验证对齐规则 下表是各种数据类型 image.png 我们可以通过下图来说明为什么两个结构体MyStruct1和 MyStruct2 内存大小为什么不一致的情况 image.png MyStruct1...18, 根据内存对齐原则,内存大小必须是最大成员的整数倍, 其中最大成员为 8, 向上取整,所以 sizeof 最后的结果为 24 内存优化,属性重排 MyStruct1通过内存字节对齐原则,增加了...这里总结下苹果的内存对齐思想 大部分内存都是通过固定的内存块进行读取 尽管我们在内存中采用了内存对齐的方式,但是并不是所有内存都可以进行浪费的,苹果会自动对属性进行重排,用此来优化内存 字节对齐到底采用多少字节对齐...8 字节对齐,8 字节对齐已经足够满足对象的需求了 apple 系统为了防止一切的容错,采用的是 16 字节对齐,主要是因为采用 8 字节对齐时,两个对象的内存会紧挨着, 总结 综合前文提到的获取内存大小的方式

1.4K55

Golang中的内存对齐

什么是内存对齐, 为啥要内存对齐?在解释什么是内存对齐之前,我们需要先了解一下CPU内存数据交互的过程。CPU内存是通过总线进行数据交互的。...其中地址总线用来传递CPU需要的数据地址,内存将数据通过数据总线传递给CPU, 或者CPU将数据通过数据总线回传给内存。...之所以有些CPU支持访问任意地址,是因为处理器在后面多做了很多额外处理。---(4) 拓展阅读【1】现代处理器原子操作的实现原理: 1. 处理器会自动保证基本的内存操作的原子性。...处理器保证从系统内存当中读取或者写入一个字节是原子的,意思是当一个处理器读取一个字节时,其他处理器不能访问这个字节的内存地址。...复杂的内存操作处理器不能自动保证其原子性,比如跨总线宽度,跨多个缓存行,跨页表的访问。但是处理器提供总线锁定和缓存锁定两个机制来保证复杂内存操作的原子性。3.

4K41

为什么编程更关注内存而很少关注CPU

但不知道大家发现没有,我们编程的时候,经常在关注内存问题,比如堆和栈的区别、内存分配与释放、指针问题、内存泄露问题等等,但为什么作为执行程序的核心角色——CPU,我们却很少去关注它呢?...x86的CPU有哪些常用寄存器,分别是做什么用的? 虚拟地址、逻辑地址、线性地址、物理地址分别是什么,有什么区别?...但是用汇编语言编程,太伤脑子了,开发效率低不说,更重要的是,辛辛苦苦吭哧吭哧写完,结果换个CPU平台还没法通用。 后来,计算机工程师们开始思考:编程为什么还要考虑CPU?得把这些东西屏蔽掉!...计算机工程师们又开始思考:为什么还要考虑操作系统、内存这些东西?于是直接面向虚拟机、解释器的语言又出来了。...如果你是Java、Python、JavaScript的程序员,想想你在编程的时候会关心操作系统,会关心内存管理吗? 估计以后会有人提问:为什么编程很少关注操作系统了?为什么编程很少关注内存了?

16010
领券