【问题标题】:When is memory space allocated to a variable?什么时候为变量分配内存空间?
【发布时间】:2015-01-22 17:20:17
【问题描述】:

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

int a;

或者当一个值被分配给它时它是否分配内存:

a = 5;

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

【问题讨论】:

  • 什么样的变量?本地、实例、类?
  • 认为是局部变量,不同种类有区别吗?
  • 是的,本地原语变量存在于堆栈中,类实例(对象)存在于堆中(它们的引用是本地的 -> 在堆栈上)。
  • 没有“在变量声明期间”之类的东西,因为声明不是事件。

标签: java


【解决方案1】:

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

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

对于静态变量,这是在“初始化”类时(在加载后和首次使用之前的某个时间发生)。

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

【讨论】:

  • 感谢clear concept +1,如果你要学习内存管理,请提供任何链接。
【解决方案2】:

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

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

JVM 将内存分为栈内存和堆内存。每当我们声明新变量和对象、调用新方法、声明字符串或执行类似操作时,JVM 都会从堆栈内存或堆空间为这些操作指定内存。

  • 在堆栈中创建局部变量
  • 实例变量是在堆中创建的,是它们所属对象的一部分。
  • 在堆栈中创建引用变量。

【讨论】:

    【解决方案3】:

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

    一个简短的轶事......

    过去的 C 编程语言要求方法中使用的所有变量都必须在方法的顶部声明。这是因为编译器习惯于在您进入方法后立即为方法中的所有堆栈(局部)变量保留存储空间。今天,这个要求不存在,部分原因是编译器要聪明得多。

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      相关资源
      最近更新 更多