Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CPU与内存通信_C_Memory_Pointers_Cpu - Fatal编程技术网

CPU与内存通信

CPU与内存通信,c,memory,pointers,cpu,C,Memory,Pointers,Cpu,我是程序员初学者,但我想更深入地理解这些东西。我做了一些研究,读了很多文章,但有些东西我还不懂 在编写基本内容(C语言)时: 我发现(主要在32位CPU上)整数代替32位=4字节。所以在我代码的第一行,CPU进入内存。内存是字节可寻址的,所以CPU为变量选择4个连续字节,并将地址存储到第一个(或最后一个)字节 在代码的第二行,CPU使用MyNumber变量的存储地址,进入内存中的该地址,并在那里找到32位保留空间。他现在的任务是在那里存储数字“3”,因此他用序列00000000-00000000

我是程序员初学者,但我想更深入地理解这些东西。我做了一些研究,读了很多文章,但有些东西我还不懂

在编写基本内容(C语言)时:

我发现(主要在32位CPU上)整数代替32位=4字节。所以在我代码的第一行,CPU进入内存。内存是字节可寻址的,所以CPU为变量选择4个连续字节,并将地址存储到第一个(或最后一个)字节

在代码的第二行,CPU使用MyNumber变量的存储地址,进入内存中的该地址,并在那里找到32位保留空间。他现在的任务是在那里存储数字“3”,因此他用序列00000000-00000000-00000000-00000000-00000011填充这四个字节。 在第三行,它也这样做——CPU进入内存中的那个地址并加载存储在那个地址中的数字

(第一个问题——我理解得对吗?)

我不明白的是:
该地址(指向该变量的指针)的大小在32位CPU中为4字节。(这就是为什么32位CPU最多可以使用4GB内存的原因——因为只有2^32个不同的二进制长度为32的地址)
现在,CPU在哪里存储这些地址?他是否有自己的内存或缓存来存储这些地址?而且为什么它将32位长的地址存储为32位长的整数?在大小相同的情况下,直接将实际数字存储在缓存中不是更好吗

最后一个——如果它在自己的缓存中存储所有这些整数的地址,并且长度相同(4字节),那么它将需要与实际变量完全相同的空间来存储地址。但是变量可能会占用4GB的空间,所以CPU必须有自己的4GB空间来存储这些变量的地址。这听起来很奇怪

谢谢你的帮助
我试图理解这一点,但这太难了-[

(第一个问题——我理解得对吗?)

首先要认识到的是,该值可能根本不存储在主内存中。编译器可能会决定将其存储在寄存器中,因为这更为理想。1

内存是字节可寻址的,所以CPU为变量选择4个连续字节,并将地址存储到第一个(或最后一个)字节

假设编译器决定将其存储在主内存中,那么是的,在32位机器上,
int
通常为4个字节,因此将分配4个字节用于存储

该地址(指向该变量的指针)的大小在32位CPU中为4字节(这就是为什么32位CPU最多可以使用4GB内存的原因,因为只有2^32个二进制长度为32的不同地址)

请注意,
int
的宽度和指针的宽度不必相同,因此不一定与地址空间的大小有关

现在,CPU在哪里存储这些地址

对于局部变量,地址被有效地硬编码到可执行文件本身,通常作为堆栈指针的偏移量

对于动态分配的对象(即
malloc
-ed中的内容),程序员通常会维护一个相应的指针变量(否则会出现内存泄漏!)。该指针也可以动态分配(对于复杂的数据结构),但如果你回溯得足够远,你最终会得到一个局部变量。在这种情况下,上述规则适用

但是变量可能会占用4GB的空间,所以CPU必须有自己的4GB空间来存储这些变量的地址

如果您的程序由独立的
malloc
-ing数以百万计的
int
s组成,那么是的,您最终会得到指针所需的同样多的存储空间。但大多数程序看起来不是这样的。您通常会分配更大的对象(如数组或大型结构)

缓存

存储内容的具体位置取决于体系结构。在现代x86上,CPU和主存之间通常有2到3层缓存。但缓存不可独立寻址;CPU无法决定将
int
存储在缓存中而不是主存。相反,缓存实际上是一个冗余的c主存储器子集的opy

另一个要考虑的是,编译器在分配对象的存储时通常会处理虚拟地址。在现代x86中,这些映射被映射到物理地址(即对应于主存储器中物理存储字节的地址),由专用硬件,以及OS支持。


1.或者,编译器可以完全优化它

在代码的第二行,CPU使用MyNumber变量的存储地址,进入内存中的该地址,并在那里找到32位保留空间

几乎正确。内存基本上是非结构化的。CPU看不到有32位的“保留空间”。但CPU被指示读取32位数据,因此它从指定的地址开始读取32位数据。然后它只需要希望/假设这32位实际上包含有意义的内容

现在,CPU将这些地址存储在哪里?他是否有自己的内存或缓存来存储这些地址?为什么它将32位长的地址存储到32位长的整数中?如果大小相同,只将实际数字存储在缓存中不是更好吗

CPU有少量的寄存器,可以用来存储数据(普通CPU有8个、16个或32个寄存器,因此它们只能保存当前正在处理的特定变量)。因此,首先回答最后一部分,是的,编译器肯定会(也可能会)生成代码来存储
int
int myNumber;
myNumber = 3;
printf("Here's my number: %d", myNumber);