C++ 内存寄存器的名称是如何分配的?

C++ 内存寄存器的名称是如何分配的?,c++,memory,C++,Memory,我已经在Matlab中为研究生水平的数值分析课程和统计模拟编写了很多程序,但我现在正在尝试学习一种更通用的语言。我用Lippman的“C++入门”来教自己C++。在阅读指针部分时,我遇到了一些让我困惑的事情。我编译并运行了以下代码: #include <iostream> int main() { int ival = 42; int *p = &ival; std::cout << p << std::endl; } 这让我感到困惑

我已经在Matlab中为研究生水平的数值分析课程和统计模拟编写了很多程序,但我现在正在尝试学习一种更通用的语言。我用Lippman的“C++入门”来教自己C++。在阅读指针部分时,我遇到了一些让我困惑的事情。我编译并运行了以下代码:

#include <iostream>

int main() {
  int ival = 42;
  int *p = &ival;

  std::cout << p << std::endl;
}
这让我感到困惑,有几个原因

1) 这是一个12位的十六进制数。这似乎意味着至少有16^12(=2^48)位(或字节)的可用存储空间。但是,我安装了4 GB的DDR3 RAM,所以我应该只有4*2^30字节=32*2^30位=2^35位的可用存储空间。所以,我的问题是:这个地址实际上是在RAM中,还是在处理器的缓存中?如果在RAM中,内存寄存器如何在RAM中标记?或者,我完全偏离了目标?在我的RAM中,似乎不可能有一个对应于每个12位十六进制数(甚至11位,如果最左边的数字保持不变)的内存寄存器

2) 每次我运行程序时,ival都存储在完全相同的位置。如果我重命名变量并更改其值,则仍然是这样。如果创建第二个变量kval,则其位置为:

0x7fff5fbffa78
距ival位置4字节。(现在我假设地址是字节的,因为int使用4字节。)C++编译器在构建程序时总是以相同的内存地址开始吗? 我正在使用MacBookPro,它有4GB的DDR3内存和6MB的二级缓存(我知道,这是一台有5年历史的机器),我正在使用g++编译器。我希望最终学会组装,真正理解这些东西是如何工作的,这就是为什么我要深入研究这个问题

我试图在Google和Stack Overflow上找到这些信息,但没有任何运气。此外,据我所知,这不是在我正在编写的C++书籍中解决的。

提前感谢您的时间,如果还有其他有用的信息,请告诉我

  • 您的操作系统实现。内存不是连续分配的,因此指针确实指向有效内存(从进程的角度来看)

  • <> > C++编译器可能会将变量放在类似的地方,用于类似的程序。然而,这不仅取决于编译器,操作系统也会影响这一点(例如,使用)

    两个词-虚拟内存。代码中使用的内存地址不是物理内存地址,而是操作系统在幕后映射到物理内存地址的虚拟内存地址。这使得操作系统允许不同进程在内部使用相同的内存地址,但使它们在物理上彼此隔离,从而将每个进程的虚拟内存池映射到物理内存的不同区域,甚至在可用RAM耗尽时映射到HDD空间

    您的输出包含超过8个十六进制数字这一事实意味着您可能正在编译一个64位程序(它使用最多16个十六进制数字的地址)。如果将程序重新编译为32位,则会看到不同的输出

  • 地址是指针“p”在进程的“虚拟”内存中的位置。阅读“虚拟内存管理”,了解操作系统如何管理内存。维基百科有一篇很好的文章:

  • 局部变量的地址取决于两件事:1。编译器,以及2。操作系统在其中加载进程的文本段。大多数编译器将执行一些优化技术,这些技术可能会导致变量四处移动。如果操作系统实现完全ASLR,则绝对位置也将更改


  • 谢谢你的回复。这正是我要找的。我想还有一些事情我不明白。我感谢你的帮助!谢谢你的回复。我不知道虚拟内存的额外层。我会支持你的回答,但因为我是新来的,所以我的声誉还不够高。再次感谢!谢谢你的回复。我不知道虚拟内存的额外层。我会支持你的回答,但因为我是新来的,所以我的声誉还不够高。再次感谢!
    0x7fff5fbffa78