13

我非常了解 32 位或 64 位系统的含义。所以基本上所有的寄存器或字长都是 32 位或 64 位。

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

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

4

2 回答 2

6

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

于 2012-09-19T02:15:49.917 回答
3

这取决于汇编程序,它可以选择给出一个内存字或一个字节。
所以现在即使你的单词中有 4 个不同的字符,会发生的情况是它们都被一次访问,但只有你需要的一个被操作。即它们都从内存进入处理器,然后只考虑你想要的字节,其他的被拒绝。

于 2013-02-07T13:35:26.030 回答