变量的地址在执行过程中可以更改吗?

Can the address of variable change during execution?

本文关键字:过程中 地址 执行 变量      更新时间:2023-10-16

我正在读取变量的地址绑定,并想知道变量的地址在任何情况下在执行过程中是否更改?会不会由于 JVM 或 CLR 中的垃圾回收而发生?那么C和C++呢?

这在很大程度上取决于语言以及更改地址的含义。在C++中,对象的地址是唯一标识它的内容,并且不能移动它们。一些托管语言(包括 Java 和 C#(使用代垃圾收集器,这些垃圾收集器实际上在内存中移动对象(在代 GC 中,对象会随着时间的推移从一代移动到另一代(,但事实是你不应该关心: 在那些可以获得对象地址的语言中,地址是固定的, 在地址固定的那些中,它不是对象可感知状态的一部分......

另请注意,我在这里使用的是对象,而不是变量,因为我相信这是您感兴趣的。有一条细线将对象和变量分开,例如,在Java中,引用是可用于访问对象的变量。但我什至不会尝试进入任何一个的确切定义......

如果你的代码有未定义的行为,那么所有的赌注都关闭了,是的,它可能会发生。
但是在有效的 C/C++ 程序中,变量的地址不会改变。

在有效的 C/C++ 程序中,除非您的代码有意或其他方式更改变量的地址,否则执行环境不会更改该地址。

它不太可能改变,但不要基于它不会改变的假设来编写代码。

在Java中,某些变量的地址可以更改(例如静态或实例字段(,而其他变量通常不能更改(例如局部变量(。 对于当前一代 JVM,线程堆栈位于堆外部的内存段中,GC 不会移动它们。

但是,对于"获取变量的地址"而言,这是没有意义的,因为您无法在Java中执行此操作。 (如果可以的话,那么GC有责任处理搬迁问题。

基本上,变量继续引用程序执行时间内的相同值或内存位置。但是这可以改变,使其uninitialized(具有未定义的值(,因此尚未明确给定特定值。这可能会产生不可预测的结果。为了处理此类问题,内存中变量所需的空间只能在首次使用变量时分配,并在不再需要时释放

在 c++ 中,地址不会改变。

请注意,在 c++ 中,你可以覆盖 & 运算符,但对于类 tyoe 的变量,所以即使地址不会改变,你可能从 &variable 得到的值也可能会改变(这不是地址改变,但可能会令人困惑(