Почему Project Valhalla не вводит изменяемые структуры?

Мне кажется, что примитивные классы могли бы вести себя более эффективно (при разумных размерах), если бы они не были неизменяемыми, как предлагается в настоящее время, а работали бы больше как структуры C.

Учитывая этот примитивный класс

      primitive class Point implements Shape {
    public long x;
    public long y;

    public Point(long x, long y) {
        this.x = x;
        this.y = y;
    }

    public boolean contains(Point p) {
        return equals(p);
    }
}

interface Shape {
    boolean contains(Point p);
}

И массивPoint[] points = new Point[N];

Почему бы нам не сделать это?

      points[0].x = 42;      //lastore
points[1].x++;         //laload, iinc, lastore

Point p = points[2];   //laload, laload
Shape s = p;           //new Point.ref (boxing)
p.x++;                 //iinc
assert !s.contains(p);

Вместо этого это звучит так, как будто текущий дизайн предназначен для чтения всей точки, видоизмененной с использованиемwithfieldи записывается полностью, что кажется расточительным, особенно для больших типов. Или компиляторы обычно применяли бы здесь исключение копирования?

Обратите внимание, чтоPoint здесь должно быть сведено, а не сведено, чтобы пользователь мог быть уверен, что не изменит общий экземпляр.

Может ли кто-нибудь еще прояснить причину неизменности примитивных типов?

@видеть

0 ответов

Другие вопросы по тегам