3

在 Java 中,您声明一个数组,然后调用new分配空间。因此,与大小为 4 的数组相比,具有 4 个命名整数的类占用更少的空间并具有更好的局部性。

有没有办法拥有一个由 4 个元素组成的数组,但它的分配方式与命名变量相同a1, a2, a3, a4

对于那些了解 C++ 的人来说,这与要求相同,int x[4]而不是int *x

class X
{
   int x1;
   int x2;
   int x3;
   int x4;
};

[ Class OID ][x1][x2][x3][x4] = 1 ref + 4 int

class Y
{
   int y[];
};

y=new int[4];

[ Class OID ][Y] ======> [Array OID][Array Size][y][y][y][y] = 3 ref + size + 4 int
4

2 回答 2

3

从 Java 6 开始,在理想情况下,对象实际上是在堆栈上而不是在堆上分配的——换句话说,这正是您所要求的。通常,这会尝试用于其引用不离开创建它们的范围的对象。所以事实是,事实上,有时“新”是完全免费的!尽管 Java 代码看起来冗长且效率低下,但有几层优化编译器可以将您编写的内容转化为高效的机器代码。

于 2013-11-15T03:42:05.400 回答
0

你唯一能做的就是这个

int x1, x2, x3, x4;

void set(int i, int v) {
    switch(i) {
    case 0:
        x1 = v;
        break;
    ...
    default:
        throw new IndexOutOfBoundsException();
    }
}

int get(int i) {
...

请注意,字节码中的切换是经过优化的,它不会i按顺序进行测试,而是直接进入所需的代码

ILOAD 1
TABLESWITCH
  0: L1
  1: L2
  2: L3
  3: L4
  default: L5
于 2013-11-15T04:47:29.053 回答