-
寄存器
寄存器(Register)是CPU内部非常小、运行非常快的存储部件,一般容量很小,32位的CPU寄存器一般能储存32位(4字节)的数据;64位CPU寄存器一般存储64位(8个字节)的数据。
所以,现代CPU都内置了几十上百个寄存器。
即,我们常说的多少位的CPU,指的就是寄存器的位数。
CPU用寄存器来记录程序的运行状态,然后根据它的值再决定下一步的操作。
-
数据总线
数据总线位于主板上,与CPU是并列关系。用于在内存和CPU之间传输数据。
CPU的最大数据处理能力,就是CPU所能够支持的数据总线的最大根数。
8位–>16位–>32位–>64位,
位数即可以指寄存器,也可以指总线,大部分时候两者相同。
还有个地址总线,用于在内存上定位数据。
-
主频
表示单位时间内,计算的次数。
几十KHz–> 几百MHz --> 4GHz,
扫描二维码关注公众号,回复: 8540875 查看本文章硅晶体的硬件限制,导致只能往多核方向发展,
-
CPU的两个方面
CPU有两个重要指标:数据总线和主频,决定了两个方面:数据处理能力和单位时间里数据处理次数,两者的乘积就是CPU单位时间内的数据处理量。
而数据处理能力(即数据总线)是一次的数据处理量。
CPU一次(一个时钟内)能处理的数据的大小由寄存器的位数和数据总线的宽度决定。
-
编译模式
-
32位编译模式
再32位模式下,一个指针或地址占用4个字节的内存,共有32位,理论上能够访问的虚拟内存空间大小为2^32 = 0X100000000 Bytes,即4GB,有效虚拟地址范围是0 - 0XFFFFFFFF。
就是说,32位编译模式下,不管实际物理内存有多大,程序能够访问的有效虚拟地址空间最大就是4GB。
即便很多PC机扩容到8GB的内存(物理),对于32位编译模式下的程序也不会有提高,它只能用其中的4GB。
-
64位编译模式
在64位编译模式下,一个指针或地址占用8个字节的内存,共有64位,理论上能够访问的虚拟内存空间大小位2^64,远超实际物理内存所能到达的可能。
-
CPU读取内存数据限制
计算机内存是以字节(Byte)为单位划分的,理论上CPU可以访问任意编号的字节,但实际并非如此。
CPU
通过地址总线
来访问内存
,一次能够处理几个字节的数据,就命令地址总线
读取几个字节的数据。32位
的CPU
一次可以处理4个字节
的数据,那么每次就从内存
读取4个字节
的数据;少了浪费主频
,多了没有用。32位CPU实际寻址的步长为4个字节,因此只能对编号为4的倍数的内存寻址,比如*0,4,8,12…而不会对编号1、2、3、5、6…*的内存寻址。
因此,
一个变量
最好位于一个寻址步长
的范围内,这样一次就可以读取到变量的值,如果跨补偿存储,就需要读取两次进行拼接,自然降低效率。比如一个长度为
4个字节
的int
类型,如果地址为8,非常简单,对编号为8的内存寻址一次就可以;如果地址为10,就需要三步操作:- 先对编号8的内存寻址,读取4个字节,得到这个
int数据
的前半部分; - 再对编号为12的内存寻址,读取4个字节,得到这个
int数据
的后半部分; - 最后将上面两个部分拼接起来,得到需要的
int数据
;
将一个数据尽量放在一个步长之内,避免跨步长存储,这称为内存对齐。
内存对齐,是计算机的运行原理,并不是C语言的特性,Python等其他编程语言也会有内存对齐的问题。
- 先对编号8的内存寻址,读取4个字节,得到这个
-
References
C语言与内存需要知道的事情:寄存器、总线、主频、编译模式
猜你喜欢
转载自blog.csdn.net/The_Time_Runner/article/details/103721457
今日推荐
周排行