Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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
C++ 虚拟内存还是物理内存_C++_C_Memory_Virtual Memory - Fatal编程技术网

C++ 虚拟内存还是物理内存

C++ 虚拟内存还是物理内存,c++,c,memory,virtual-memory,C++,C,Memory,Virtual Memory,假设我们用C编写一个程序,并打印程序中声明的一个变量的地址,屏幕上打印的地址是该变量的虚拟地址还是物理地址? 如果它是虚拟地址,为什么它仍然具有与物理内存位范围相同的范围?例如,对于32位机器,如果它返回0x833CA23E,则该地址将是虚拟内存中的虚拟地址,因为应用程序不知道物理内存。它被内核和MMU隐藏 我不知道你所说的相同的“位范围”是什么意思。如果您有一个32位地址空间,它将覆盖整个32位空间,而不管您有多少物理内存。对于64位也是如此。在大多数典型情况下(Windows、Linux等)

假设我们用C编写一个程序,并打印程序中声明的一个变量的地址,屏幕上打印的地址是该变量的虚拟地址还是物理地址?
如果它是虚拟地址,为什么它仍然具有与物理内存位范围相同的范围?例如,对于32位机器,如果它返回0x833CA23E,则该地址将是虚拟内存中的虚拟地址,因为应用程序不知道物理内存。它被内核和MMU隐藏

我不知道你所说的相同的“位范围”是什么意思。如果您有一个32位地址空间,它将覆盖整个32位空间,而不管您有多少物理内存。对于64位也是如此。

在大多数典型情况下(Windows、Linux等),它将是一个虚拟地址

在Linux和Windows这样的典型情况下,虚拟地址和物理地址通常都是32位,因此数字在同一范围内是不可避免的。分配超过4G字节的内存是可能的,当/如果这样做的话,最终得到的地址会超过32位——但除非你采取特殊的步骤,否则默认情况下会得到32位地址

当您在32位操作系统下使用超过4GB的内存时,您通常是通过一些特殊的API(如Windows)来实现的。使用这些工具,您可以访问超过4GB的RAM,但对于接近可移植的代码,默认情况下不会发生这种情况


某些(某些版本的)操作系统还使用Intel的物理地址扩展(PAE)来让系统作为一个整体访问超过4 GB的RAM,但即使在使用这些RAM时,系统上运行的任何单个进程仍限于寻址4 GB(也就是说,使用PAE,每个进程可以有4 GB的限制,而较旧的系统总共有4 GB的限制,根据需要在进程之间划分)。

在大多数情况下,它将是32位虚拟地址

如果您的操作系统支持分页,那么它将是虚拟地址。它可能已使用分页映射到相同的物理地址。Linux和Windows进行分页

另一件重要的事情是体系结构。在Intel x86 32位系统上,它将是32位地址。地址的前10位将用于获取页表。后10位将用于从所选页表获取页。最后12位将提供该页的实际物理地址


我希望它能回答你的问题。

C和C++编程语言都不包含任何“虚拟”或“物理”内存的概念。只有“内存”。这个问题不能用任何一种语言来回答。只有物理和虚拟地址相同的机器才是缺少虚拟内存的系统。(和一个内存管理单元),例如许多嵌入式系统。例如,ucLinux是Linux的一个版本,设计用于在这些平台上运行。FreeRTOS是一个小型操作系统(可以降低到8kB左右),不支持虚拟内存。此外,在现代系统中,“比特数”机器的位数是虚拟地址中的位数。物理地址可能没有那么多位(例如,在64位机器上,物理地址可能只有实际连接的40或48位;忽略高阶物理地址位)。在较旧的体系结构中,它描述了内部数据寄存器的宽度,以及(物理)地址有更多的位。例如,8086是16位,但有20位寻址(1024k);6502是8位,但有16位地址(64k)@MikeDeSimone:请注意,在硬件级别,当前的x86-64虚拟地址也只有48位。没错,但指针仍然是8字节,而不是6字节。这是否意味着如果我在32位机器上有4GB的ram,运行32位操作系统,虚拟内存空间和物理内存空间将是相同的?@shaveenk,不,内核将选择一个映射d MMU将强制执行映射。通常,您的程序与内核和其他应用程序共享资源,因此将所有应用程序的所有虚拟地址映射到相同的物理地址是没有意义的。此外,如果您支持虚拟内存,计算机可以使用一些磁盘空间作为附加内存“分页”当不使用内存页时,内存页会被存储到磁盘上,而其他进程需要更多的内存。当分页发生时,所涉及的进程会停止,因此他们不会注意到任何错误;对他们来说,看起来他们的数据总是在内存中。