运算符 (&) 返回的地址是否为虚拟?

Is the address returned by operator(&) virtual?

本文关键字:是否 虚拟 地址 返回 运算符      更新时间:2023-10-16

如果是,那么为什么同一程序的后续调用会导致不同的地址,这些地址差异很大?

这是程序的结果

#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

不,地址运算符不是虚拟的:称它为虚拟的没有意义。

您看到的是,每次运行程序时,程序的机器堆栈都被放置在不同的地址,称为ASLR,地址空间布局随机化。这是一种典型的随机化,有助于击败依赖于固定已知地址的恶意软件。它与语言无关,而是与构建工具有关。

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


可以说地址是虚拟的,但这与您看到的结果无关。虚拟内存依赖于地址的硬件级间接寻址,因此进程使用的每个逻辑地址都会被动态转换为相应的物理地址


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

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