5

我想知道如何(如果可能的话)使用数据布局对 Java 类进行编程Array of Class,例如:

public class X{

     double a;
     double b;
     double c;
}

public X array_of_x[SIZE] = new X [SIZE];

但在内部,数据将存储为如下布局Class of Arrays

 public class X{

     double a[] = new double [SIZE];
     double b[] = new double [SIZE];
     double c[] = new double [SIZE];
}

public X class_x = new X();

我的目标是程序员可以像第一个那样以更直观的风格进行编程,但是在内部我会进行转换,以便数据可以在内存中连续,并且我会获得更高的性能。

有没有办法这样做,以便它可以接受任何具有第一种结构类型的类并能够将其转换为第二种方法?(或者是任何能够进行这种转换的工具)。

4

1 回答 1

3

让我们创建一个展示第一个布局以供使用的界面,并为该界面创建一个在内部使用第二个布局的实现。(从代码中删除了访问修饰符。)

interface X {
    double getA();
    double getB();
    double getC();
};

interface ArrayOfX {
    X get(int index);
};

class ContiguousArrayOfX implements ArrayOfX {
    class ContiguousX implements X {
        int index;
        ContiguousX(int index) {
            this.index = index; }
        double getA() { return a[index]; }
        double getB() { return b[index]; }
        double getC() { return c[index]; }
    }

    X get(int index) {
        return new ContiguousX(index); }

    double a[] = new double [SIZE];
    double b[] = new double [SIZE];
    double c[] = new double [SIZE];
};

如果想减轻 GC 的负担,还可以缓存ContiguousX. 如果对象完全分配在堆上,这在很大程度上取决于 JIT 编译器的能力ContiguousX——它们很可能存在于堆栈中,在这种情况下,开销可以忽略不计。作为最后的手段,您可以为快速访问定义一个替代接口:

interface FasterArrayOfX {
    double getA(int index);
    double getB(int index);
    double getC(int index);
};

class FasterContiguousArrayOfX extends ContiguousArrayOfX implements FasterArrayOfX {
   // Exercise left to the reader
};

通过针对接口进行编程,您以后始终可以自由选择存储。

为任何给定的类布局编写代码生成器相当简单。上面的代码可以用作样板,只有方法和数组声明取决于您要获取的类布局。我不知道任何现有的工具。

于 2012-12-10T23:10:31.387 回答