variables - CPU 如何在 32 位内存和 32 位处理器中访问单个字节的内存

标签 variables architecture bus

我很明白 32 位或 64 位系统是什么意思。所以基本上所有的寄存器或字长都是 32 位或 64 位。

为简单起见,让我们以 32 位系统为例,假设我正在用 C 编写程序。如果我声明一个 int 类型,请说“int a = 5;”然后为 var a 保留一个字长的内存位置。所以当我想访问它时,我可以使用该内存位置的字地址来访问它。

但是说我有 4 个字符“char a,b,c,d;”因为它是一个字节,每个字节都放在一个字中,所以如果我只想访问字符 b,我该怎么办?(说内存是字节可寻址的)现在说 b 是字中的第三个字节... .那么它是怎么上车的?第 3 个字节不是硬连线到总线中的第 17 至 24 行吗?那么当只有 b 被访问时,其他 24 行会发生什么?

最佳答案

您问题的答案很大程度上取决于您使用的编译器以及 CPU、内存 Controller 和内存架构(缓存和外部内存)的内部工作原理。
您只能控制编译器(假设您使用的是 C 或 C++ 编译器)。当您使用小于字大小的变量时,编译器有不同的模式。有速度优化和内存优化的标志。根据这些标志中的哪一个被打开,编译器可能会选择生成将所有四个变量(在您的情况下)打包成一个字的代码。或者编译器可以选择为每个变量分配一个内存字,但使用特定字节来存储实际值。编译器针​​对每种情况执行此操作的方式是为 CPU 生成不同的指令集。在后一种情况下,如果变量是从内存中读取的,那么整个字会被放到总线上,然后被放入一个通用寄存器中。在前一种情况下,字被放入寄存器,但随后字可以按位移位,其他位可以通过使用逻辑与运算清零。这样正确的字节将在寄存器中。或者可能是 CPU 架构支持一个字中的字节级访问,在这种情况下,它将只是 CPU 执行的一个操作。
最后,了解内部发生的事情是个好主意,但您不会太在意,因为从您的角度来看,编译器生成的指令集会正常工作。只有在编写性能敏感软件时才会关心。在这种情况下,您需要了解 CPU 和内存的详细信息以及编译器支持的标志。

关于variables - CPU 如何在 32 位内存和 32 位处理器中访问单个字节的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12480407/

相关文章:

google-maps - 谷歌地图API : Display of alternative bus routes possible?

bash - 为什么使用 Bash 只读变量捕获输出无法捕获返回码 $?

html - 变量的空参数

函数内部的javascript变量指针

c - 使用 "core clock cycles"的 Intel CPU 上的时序代码?

mysql - 用于提供大量历史信息的数据库服务器架构

c++ - 调用删除时的总线错误 (C++)

java - 数字文字中的下划线

database - 向用户公开代理键

c - 为什么这个 C 代码会出现总线错误? (不允许外部函数)