为了账号安全,请及时绑定邮箱和手机立即绑定

为循环中的局部变量分配空间

为循环中的局部变量分配空间

莫回无 2021-06-01 09:08:44
(真或假)在循环体中声明的局部变量的空间在循环体执行时分配,在循环体结束时释放。这个问题的答案是错误的。但为什么?
查看完整描述

2 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

该语句为假,因为未分配和释放局部变量空间。它存在于堆栈中,并在进入方法时保留。


要查看堆栈空间是如何使用的,请编写一个小测试程序:


public static void test() {

    {

        int a = 1;

        long b = 2;

        int c = 3;

    }

    {

        int x = 4;

        int y = 5;

        long z = 6;

    }

}

现在使用以下命令反汇编它以查看字节码。


javap -c Test.class

这是输出。为方便起见,我在右侧添加了 Java 代码。


  public static void test();

    Code:

       0: iconst_1                     int a = 1;

       1: istore_0

       2: ldc2_w     #22   long 2l     long b = 2;

       5: lstore_1

       6: iconst_3                     int c = 3;

       7: istore_3

       8: iconst_4                     int x = 4;

       9: istore_0

      10: iconst_5                     int y = 5;

      11: istore_1

      12: ldc2_w     #24   long 6l     long z = 6;

      15: lstore_2

      16: return                       return;

发生的情况是该方法保留了 4 个“插槽”。一个int变量占用 1 个槽位,一个long变量占用 2 个槽位。


所以代码真的说:


slot[0] = 1

slot[1-2] = 2L

slot[3] = 3


slot[0] = 4

slot[1] = 5

slot[2-3] = 6L

这显示了插槽如何被不同代码块中声明的局部变量重用。


查看完整回答
反对 回复 2021-06-02
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

是(作为以二进制形式要求的答案)

局部变量存储在堆栈内存中。它是在调用方法时分配的用于存储局部变量的临时内存。在 Loop 的情况下,局部变量的范围仅限于循环开始和结束。(例如,在 while(...) { --- 局部变量的范围 -- } )范围受 {} 大括号限制。

当在循环内创建变量时,临时内存被分配到堆栈内存中,当变量的作用域结束时,它可以被重用。

注意:局部变量不会被垃圾收集。


查看完整回答
反对 回复 2021-06-02
  • 2 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信