访问C++变量时,其内容如何解析?

Leo*_*nid 2 c++ memory

在C++中访问变量时,其内容如何解析?

操作系统是否可以将变量重新映射到不同的地址而不影响其逻辑地址?是否有可能在2个不同的进程中有2个变量指向同一个逻辑地址?

tem*_*def 8

是的,操作系统绝对有可能在内存中移动变量.实际上,所有现代计算机都使用虚拟内存,其中每个进程都认为它可以访问机器的完整地址空间.但是,无论何时发生内存读取或写入,地址都会从进程地址空间中的虚拟地址转换为计算机实际地址空间中的某个物理地址.操作系统可以根据需要更改这些映射,可能是通过移动内存块,或者暂时将它们写入磁盘等.这样,每个进程允许多个进程使用比系统上可用的内存更多的内存,因为操作系统可以透明地将内存块移入和移出RAM,而无需进程检测到这一点.

使用虚拟内存的一个优点是两个进程可以各自使用相同的虚拟地址而不会相互冲突.例如,两个进程可能各自使用地址0xCAFEBABE,并且每个进程都看到自己的副本.但是,当进程读取或写入此值时,地址将转换为不同的物理地址,因此每个地址都可以拥有自己的副本.许多操作系统实际上提供了允许进程在需要时共享内存的功能,或者对于具有相似数据片段(例如,共享库)的许多进程具有映射到相同物理地址的不同虚拟地址的功能.

因为C++直接访问机器的底层存储器,变量被读或写在C++中,操作系统可能会强制中断的指令,页面中向其中读或写操作发生的物理存储器中,然后恢复控制的程序的任何时间.这并不是C++的特性,就像硬件的内存系统一样.

简而言之 - 程序使用虚拟地址,操作系统以一种确保每个进程认为它拥有内存系统完全所有权的方式映射到物理地址.C++程序默认使用此系统,因为它们使用的是底层硬件.