Отрывок Java, который вызывает переполнение стека в компиляторе или typechecker (javac)?

Это макросы, которые дают подсказки компилятору, о котором пути может пойти ответвление. Макросы расширяются до определенных расширений GCC, если они доступны.

GCC использует их для оптимизировать для предсказания ветвлений. Например, если у Вас есть что-то как следующий

if (unlikely(x)) {
  dosomething();
}

return x;

Тогда, это может реструктурировать этот код, чтобы быть чем-то больше как:

if (!x) {
  return x;
}

dosomething();
return x;

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

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

существует много других стратегий, которые компилятор и процессор могут использовать в этих сценариях. Можно найти больше деталей о том, как предикторы ответвления работают в Википедии: http://en.wikipedia.org/wiki/Branch_predictor

5
задан Pimin Konstantin Kefaloukos 19 February 2014 в 23:34
поделиться

2 ответа

Нашел (спросил ведущий)! Это StackOverflowException как в 6.0, так и в 7.0:

class T { }
class N<Z> { }
class C<X> extends N<N<? super C<C<X>>>> {
  N<? super C<T>> cast(C<T> c) { return c; }
}

Это от Эндрю Кеннеди и Бенджамина Пирса: о разрешимости номинала Подтип с дисперсией. Международный семинар по фондам и Разработка объектно-ориентированных языков g (FOOL / WOOD'07), Ницца, Франция 2007.

3
ответ дан 14 December 2019 в 13:39
поделиться

Вы пробовали bugs.sun.com? Вот StackOverflowError только в 5.0:

import java.util.*;

class Test<T extends Comparable<? super T>> {

    abstract class Group<E extends Comparable<? super E>> 
    extends ArrayList<E> 
    implements Comparable<Group<? extends E>> {}

    abstract class Sequence<E extends Comparable<? super E>>
    extends TreeSet<E>
    implements Comparable<Sequence<? extends E>> {}

    public void containsCombination(SortedSet<Group<T>> groups,
                    SortedSet<Sequence<T>> sequences) {
        foo(groups, sequences);
    }

    <C extends Collection<T>> void foo(SortedSet<? extends C> setToCheck,
                       SortedSet<? extends C> validSet) {}

}

Вот еще один (снова только в 5.0):

class F<T> {}
class C<X extends F<F<? super X>>> {
    C(X x) {
        F<? super X> f = x;
    }
}
3
ответ дан 14 December 2019 в 13:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: