当我们声明变量时,编译器实际上做了什么?

时间:2012-08-01 06:46:17

标签: java variables

举个例子。

public class test {
  public static void main(String args[]) {
    int a=5,b=4;
    int c=a+b;
    int d=9;
    System.out.println("ANSWER PLEASE..");
  }
}

现在当我们执行这个代码时os会做什么?

首先创建一个名为a的变量,并为bc分配类似内容的内存地址。

现在d发生了什么。 os创建一个新的内存地址,或者它只是c的地址,因为值相同。

2 个答案:

答案 0 :(得分:3)

首先,编译器做得不多。它基本上将其转换为类文件/字节码。在字节码中有一个名为“max locals”的数字,它表示运行该方法需要多少局部变量。

另一方面, JVM 读取此信息并运行代码,确保在堆栈帧上分配内存以适应所需的变量。它要求多少是高度依赖于实现的,它可以很好地优化整个事物,并分配比代码所指示的更少的字节。

答案 1 :(得分:0)

  发生了什么事。 os创建一个新的内存地址,或者它只是在c的地址中提供,因为值相同。

  • 这是标记为Java的。所以让我们保持操作系统不受影响。一切都发生在JVM管理的内存中,JVM事先以大块的形式分配。
  • 您正在谈论原始数据类型。这些很容易,因为它们是按价值存储的,而不是对居住在其他地方的对象的引用。
  • 您正在谈论局部变量。这些是在正在运行的线程的调用堆栈上分配的(不在堆内存中)。因为它们在这里也是原始的,所以根本不涉及堆。
  • 在您的情况下,为四个整数分配(在堆栈上)内存。它们中的每一个都包含分配给它的值,而不是引用。即使为所有这些值分配了相同的值,它们也是分开存在的。该方法返回时,内存被“释放”(并未真正释放,但线程不再使用)。
  • 如果那些不是整数,而是对象,你可以“共享指针”(堆上的对象),但整数按值存储(每个四个字节)。