运算符 (&) 返回的地址是否为虚拟?
Is the address returned by operator(&) virtual?
如果是,那么为什么同一程序的后续调用会导致不同的地址,这些地址差异很大?
这是程序的结果
#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
就是这样做的。
相关文章:
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 是否可以使用函数指针调用虚拟析构函数?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 重载虚拟行为是否定义良好?
- 是否可以在C++中使用虚拟类型?
- 虚拟继承中是否存在多重继承?
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 是否有任何模式等效于虚拟模板功能?
- 对静态分配的子类对象进行静态分配的纯虚拟父类引用是否合法?
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- 我是否应该在包含虚拟方法的类上使用'memcpy'?如果没有,如何替换它?
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- 使用范围解析运算符时,在构造函数中调用虚拟方法是否安全?
- 非虚拟成员函数是否可以使用模板参数?
- 是否可以创建虚拟迭代器类?
- 是否有 lint 工具可以检查子类虚拟函数是否与父类定义匹配?
- 虚拟 CTOR 的克隆函数实现是否有问题
- 基类能否知道派生类是否已重写虚拟方法
- 给定这两种类型,我是否可以确定虚拟函数是否已被覆盖?