运营商(&)返回的地址是虚拟的吗?

时间:2015-11-18 09:36:22

标签: c++ memory-address virtual-memory

如果是,那么为什么后续同一个程序的调用会导致不同的地址变化很大?

这是程序的结果

#include <iostream>
using namespace std;

int main() {
    // your code goes here
    int i;

    cout<<&i;

    return 0;
}

-

Success time: 0 memory: 3412 signal:0

0xbf8a5fac

Success time: 0 memory: 3412 signal:0

0xbfa71c8c

Success time: 0 memory: 3456 signal:0

0xbf8c55ac

Success time: 0 memory: 3412 signal:0

0xbf9aea4c

Success time: 0 memory: 3412 signal:0

0xbffddb1c

1 个答案:

答案 0 :(得分:3)

不,地址运营商不是虚拟的:将其称为虚拟是没有意义的。

您看到的是,每次运行程序时,您的程序的计算机堆栈都放在不同的地址,称为ASLR, Address Space Layout Randomization。这是一种典型的随机化,可帮助抵御依赖固定已知地址的恶意软件。它与语言无关,而是与构建工具无关。

使用Visual C ++可以关闭随机化功能,但通常不建议这样做。

至少可以说地址是虚拟的联想意义,但这与你所看到的结果无关。虚拟内存依赖于地址的硬件级别间接,因此进程使用的每个逻辑地址即时转换为相应的物理地址,这允许例如:将内存页面交换到磁盘。在PC上有一个中间层,即两个间接层,而通用术语并没有真正涵盖这一点。

请注意,对于类类型,可以覆盖基本地址运算符。

确保使用内置地址运算符的一种方法是在应用地址运算符之前将左值表达式强制转换为char,基本上就是std::addressof确实