32位与64位架构的内存访问

时间:2014-10-21 20:18:08

标签: c 32bit-64bit processor

默认情况下,使用单个指令可以在32位和64位处理器上读取的变量的标准大小是什么?

例如,当我在C语言中有一个double(8字节大小)时,它分别在一条指令(在64位处理器上)和两次操作(在32位处理器上)读取?

我认为这个问题实际上就是我们称之为"记忆词" (等于1个字节)和"处理器字" (我不知道这个大小的值,但它取决于32位或64位处理器,对吧?)。

由于

3 个答案:

答案 0 :(得分:1)

32位处理器一次处理32位数据。 64位处理器一次处理64位数据。

  

是分别在一条指令(64位处理器)和两个操作(32位处理器)上读取的?

A" generic" 32位处理器将分别获取两个32位数据块并将它们组合在一起。确切的指令数可能取决于处理器。

话虽如此,许多处理器都有专门的架构来更好地处理浮点数据

http://en.wikipedia.org/wiki/Floating-point_unit

虽然大多数具体的32位处理器需要两次读取操作来加载64位整数,但同一处理器上的浮点类型可能不一样。

此外,某些处理器能够以少量指令处理向量。大多数现代C编译器都能够在适当的时候发出这样的指令。例如见:

http://en.wikipedia.org/wiki/SSE2

答案 1 :(得分:1)

这取决于处理器的 ISA ,它与虚拟内存地址或整数大小(32对64位)有些无关。

作为一个例子,考虑许多处理器上可用的向量扩展指令,它们在大于处理器字的内存块上运行: http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions http://www.arm.com/products/processors/technologies/neon.php

确实,当提到32位或64位处理器时,如果没有进一步的规范,我们打算所有处理器数据路径(包括地址和整数)都具有相应的大小。

在实践中,许多处理器(包括x86 / ARM)

  • 对整数/浮点数据路径和地址使用不同的大小,例如:奔腾处理器有32位整数但64位数据总线Pentium Manual
  • 在其ISA中提供单个指令,这些指令对标准处理器字的倍数(或分数)进行操作,例如:即使处理器是32位,ARM处理器也可以从内存加载双字(64位)。

这样做是为了拥有性能更好的处理器;如果提供了加载双字的指令,那么只需要提取,解码,发出,执行和提交一条指令而不是两条指令。类似地,向量指令可以执行需要使用单个指令的许多指令的作业,从而大大减少处理器的流水线中的负载。

答案 2 :(得分:0)

对于“32位”和“64位”这两个术语的实际含义,没有一致和通用的定义。大概有六个左右的特性可以用于定义它们(数据总线宽度,地址大小,通用CPU寄存器大小,可能是其他)。

这些术语在架构系列中最有意义。例如,比较x86和x86_64体系结构的特性或者32位和64位版本的SPARC是有意义的。

结论:虽然你的问题不一定含糊不清,但任何可能的答案都可能是。所谓的“32位”CPU很可能具有访问64位数量的指令。另一方面,Motorola 68008实现了16/32位指令集架构,但只有8位外部数据总线;除了速度惩罚之外,它的8位数对于应用程序是不可见的。