CPU与内存通信
我是程序员初学者,但我想更深入地理解这些东西。我做了一些研究,读了很多文章,但有些东西我还不懂 在编写基本内容(C语言)时: 我发现(主要在32位CPU上)整数代替32位=4字节。所以在我代码的第一行,CPU进入内存。内存是字节可寻址的,所以CPU为变量选择4个连续字节,并将地址存储到第一个(或最后一个)字节 在代码的第二行,CPU使用MyNumber变量的存储地址,进入内存中的该地址,并在那里找到32位保留空间。他现在的任务是在那里存储数字“3”,因此他用序列00000000-00000000-00000000-00000000-00000011填充这四个字节。 在第三行,它也这样做——CPU进入内存中的那个地址并加载存储在那个地址中的数字 (第一个问题——我理解得对吗?) 我不明白的是:CPU与内存通信,c,memory,pointers,cpu,C,Memory,Pointers,Cpu,我是程序员初学者,但我想更深入地理解这些东西。我做了一些研究,读了很多文章,但有些东西我还不懂 在编写基本内容(C语言)时: 我发现(主要在32位CPU上)整数代替32位=4字节。所以在我代码的第一行,CPU进入内存。内存是字节可寻址的,所以CPU为变量选择4个连续字节,并将地址存储到第一个(或最后一个)字节 在代码的第二行,CPU使用MyNumber变量的存储地址,进入内存中的该地址,并在那里找到32位保留空间。他现在的任务是在那里存储数字“3”,因此他用序列00000000-00000000
该地址(指向该变量的指针)的大小在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);