C语言与内存需要知道的事情:寄存器、总线、主频、编译模式

  • 寄存器

    寄存器(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个字节的数据;少了浪费主频,多了没有用。

    32CPU实际寻址的步长为4个字节,因此只能对编号为4的倍数的内存寻址,比如*0,4,8,12…而不会对编号1、2、3、5、6…*的内存寻址。

    因此,一个变量最好位于一个寻址步长的范围内,这样一次就可以读取到变量的值,如果跨补偿存储,就需要读取两次进行拼接,自然降低效率。

    比如一个长度为4个字节int类型,如果地址为8,非常简单,对编号为8的内存寻址一次就可以;如果地址为10,就需要三步操作:

    1. 先对编号8的内存寻址,读取4个字节,得到这个int数据的前半部分;
    2. 再对编号为12的内存寻址,读取4个字节,得到这个int数据的后半部分;
    3. 最后将上面两个部分拼接起来,得到需要的int数据

    将一个数据尽量放在一个步长之内,避免跨步长存储,这称为内存对齐。

    内存对齐,是计算机的运行原理,并不是C语言的特性,Python等其他编程语言也会有内存对齐的问题。

  • References

  1. C语言中文网
发布了753 篇原创文章 · 获赞 1021 · 访问量 54万+

猜你喜欢

转载自blog.csdn.net/The_Time_Runner/article/details/103721457