【问题标题】:explanation of the output of the code [duplicate]代码输出的解释[重复]
【发布时间】:2015-05-05 14:16:59
【问题描述】:

我最近被要求考虑以下代码的输出:

#include <iostream>
int gvar;
int main (void)
{
     cout << &gvar << endl;
     while (true);
     return 0;
}

编译此代码并生成可执行文件。如果此可执行文件并行运行 2 个终端。它会打印什么。

我的回答是它会打印 2 个不同的地址。但是在运行时,我发现两个终端都打印了相同的地址。

有人能解释一下为什么会这样吗?我知道这可能是由于虚拟内存造成的,但我无法将各个部分组合在一起。

【问题讨论】:

  • 我认为这与编译器的关系比任何语言都多。
  • 很可能您获得的内存地址位于可执行文件的堆栈空间中,如果是这种情况,那么它应该是相同的地址。
  • @NathanOliver 没关系,但没有那个变量不应该在堆栈上。毕竟这是一个全局变量。
  • 实际上它可能会或可能不会打印相同的地址。
  • @unwind 我不是指实际的堆栈。当时想不出进程内存空间的说法。

标签: c++ global-variables output


【解决方案1】:

很明显是由于虚拟内存,是的。

这样的代码看到的地址是虚拟的。由于每个进程都有自己的虚拟到物理映射表,因此虚拟地址在每个进程内不必是唯一的。

【讨论】:

  • 但这是否意味着每次它都会返回相同的地址。例如,它可以打印一个完全不同的地址,在映射时会返回一个不同的物理内存地址。 ?
  • @ShReYaNsH 是的,它可以,但这些是操作系统中的实现细节。它可以选择随机化使用的虚拟地址,也可以不随机化。
  • 所以我的理解是,打印相同的地址只是一个巧合。尽管看似相同的地址将映射到物理内存中的不同地址。对吗?
  • @unwind 感谢您指出正确的问题。帮了大忙!
猜你喜欢
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 2016-05-08
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多