何时将内存空间分配给变量?

时间:2015-01-22 17:20:18

标签: java

当声明变量时,编译器是否分配4个字节的内存:

int a;

或者在为其分配值时分配内存:

a = 5;

什么时候分配内存?在变量声明或初始化期间?

3 个答案:

答案 0 :(得分:6)

在分配包含它的结构时分配变量。

对于方法中的局部变量,当调用该方法时,这是(有一些警告)。

对于静态变量,这是在类初始化时#34; (在它加载之后和第一次使用之前的某个时间发生)。

对于实例变量,这是在创建实例时。

答案 1 :(得分:2)

在大多数编程语言中,允许编译器选择何时为变量分配空间。您唯一可以保证的是,存储将在您需要时可用。

一则简短的轶事......

C编程语言曾要求在方法的顶部声明方法中使用的所有变量。这是因为编译器在您输入方法后立即为方法中的所有堆栈(本地)变量保留存储空间。今天,这个要求并不存在,因为编译器更聪明。

大多数类似C语言的编译器会推迟实例分配,直到首次使用优化代码。这里真正棘手的问题是,第一次使用可能不是你认为的地方,也可能根本不会发生。例如,如果您有以下代码:

int foo(int x) {
  int y = 5;
  if (x > 5)
    y += x;
  return y;
}

您可能认为第一次使用是在为y分配5时,但编译器可以将该代码优化为更像:

int foo(int x) {
  if (x > 5)
    return 5 + x;
  return 5;
}

在这段代码中,y根本就不存在。

TL; DR - 编译器实际上并不保证在声明或使用时分配内存。相信编译器,它(通常)比我们所有人都聪明。

答案 2 :(得分:0)

当我们将“声明”变量变为“变量”时,我们意味着我们已经告诉编译器变量;即它的类型和名称,以及为变量分配的存储单元(本地或全局)。编译器的后一个操作,存储分配,更恰当地称为变量的定义

简单定义 =变量声明+变量初始化