当我参加硬件/软件界面课程时,我们的老师说cpu使用word机器获取数据,例如,CPU可以获得地址 0x00 的值,但无法获得地址 0x01 的值,但地址 0x00 的值+(字大小:通常为4字节),所以我想了解如何在< strong> c 只包含2个字节?
答案 0 :(得分:3)
不同的CPU具有不同的内存访问限制。一种常见的形式是允许在任何字节偏移处进行访问,但如果发生这种情况则会遭受性能损失,因为可能需要两个字对齐的传输以便检索操作所需的所有字节。第二种形式只是不允许不对齐的内存访问。
在第一种情况下,编译没有什么可担心的,内存可以&#34;打包&#34;或者字对齐,两者都可以工作,但是一个会更快,一个会使用更少的内存。
在第二种情况下,编译器必须生成代码以将未对齐的数据放入正确的寄存器位置,以允许进行算术和逻辑运算。这些操作以字节大小为单位移位和/或屏蔽位。例如,可能需要4字节加载来加载2字节变量。在这种情况下,2个字节的数据可能需要&#34;归零&#34;和2&#34;好&#34;可能需要将字节移入寄存器的低位。所有这些都是编译器的责任,但它增加了访问数据的开销。另一方面,这意味着数据在未存储在寄存器中时占用的内存较少。如果您有大量数据,例如几百万个整数的数组,这可能很重要;将它存储在一半的空间实际上可以使程序运行得更快(即使给出上述开销),因为两倍的数组值适合缓存。
答案 1 :(得分:0)
32位处理器使用4个字节作为整数,所以首先让我解释一下内存存储
内存容量 =如果处理器使用了单字节寻址方案,则需要4个内存周期才能执行读/写操作。因此从处理器的角度来看,内存存储如图所示。
因此,如果整数存储在地址范围0x0000-0x0003即4个字节中,则只需要一个存储器读/写周期,这样处理器就可以从额外的存储器周期中解脱出来,从而提高性能。
此外,变量分配也可能从一个不是四的倍数的数字开始,因此它可能需要2个或更多个内存周期(浮点数,双倍等等),这与它们的方式有关。存储即可。 CPU以最小读取周期数提取数据。
简称数据类型只分配了两个字节的内存,如果它从0x0001开始,则以0x0002结束,仍然需要1个读周期。但优点是整数中的分配4个字节,而short分配两个字节,因此从整数数据类型中保存两个字节。因此存储得到改善
参考: