32位计算机如何从内存中取出数据

问题描述 投票:0回答:2
#include <stdio.h>
struct var{
    
    
    char a;
    char b;
    char c;
    
};


int main()
{
    struct var r;

    printf("%zu\n", sizeof(r));
  
    return 0;
}
Output: 3

我知道如何将 3 个字节的字符类型数据存储在内存中并进行适当的对齐。

但是我很困惑,虽然 32 位计算机获取数据,但它应该一次获取 4 个字节。如果此语句成立,则在存储

char a
char b
char c
之前应进行 1 字节填充。我说得对吗?

并且在64位计算机的情况下,需要填充5个字节,然后存储

char a
char b
char c
。处理器一次会获取 8 个字节。

padding 32bit-64bit processor
2个回答
1
投票

注意,我意识到在图像中我忘记计算 0x000000 地址,抱歉。

这是一个很好的问题,如果我解释你已经熟悉的概念,我很抱歉,但以防万一我会解释。

首先,遗憾的是,与大多数事情一样,这取决于情况。我这么说是因为 64 位在不同用途之间的含义可能并不相同,因为它主要可以指数据总线,或地址总线,或两者兼而有之。这取决于您的体系结构,如果您使用的是计算机,那么很可能您在地址总线和数据总线上都使用 32 位。如果您正在开发 MCU,那么它将在很大程度上取决于 MCU 及其架构,也许您的寻址是 16 位,但数据是 32。

那么,让我们关注地址总线,有一个 32 位地址总线,意味着你可以去 2^32 个不同的地址,现在我认为这就是你感到困惑的地方,每个地址实际上是一个字节,这就是为什么32 位计算机,内存限制为 4GB,因为 2^32 = 4,294,967,296。如果每个都是一个字节,那么那就是 4GB。

现在,RAM 中每个字的长度由数据总线定义,正如我们所说,最有可能的是它也是 32 位,因此,这将允许我们容纳 4 个字节,因此,每个字将由4字节。所以在这种情况下,我们的内存“网格”看起来像这样。请注意,现在内存寻址从未真正使用过。通过字节寻址,字不需要像行那样开始/结束。

现在,填充会发生什么,首先,所有数据类型在 C 中都有一个本机大小,这个大小还取决于您的体系结构,有些数据类型使用一个字(4 个字节),有些使用 2 个字(8 个字节)和一些 1 个字节。请记住,字大小取决于数据总线大小,在本例中,32 位数据总线 = 32/8 = 4 个字。 char 类型仅使用一个字节。当您编译和运行时,处理器开始分配内存并跟踪所有内容的去向,例如,在这种情况下,您的填充并不重要,处理器知道它是空闲的,并且会在需要时分配一些东西。还要记住,单词并没有定义为RAM中的一行,只要它们是连续的,CPU就可以要求4个连续字节,也许可以使用上图作为参考,从0x00...02到0x00... 05.

例如,您可以存储在0x0000中,b存储在0x0001中,a存储在0x0002中,然后您可以存储0x0003-0x0006之间的有符号整数(在现代计算机中通常为4字节)。 cpu 跟踪整数在 0x0003-0x0006 中,c 在 0x0001 等中,并且您的结构是从 0x0000 到 0x0002


0
投票

“请注意,现在内存寻址从未真正使用过。” https://stackoverflow.com/a/71757238/12013221

用什么?

© www.soinside.com 2019 - 2024. All rights reserved.