Это макросы, которые дают подсказки компилятору, о котором пути может пойти ответвление. Макросы расширяются до определенных расширений GCC, если они доступны.
GCC использует их для оптимизировать для предсказания ветвлений. Например, если у Вас есть что-то как следующий
if (unlikely(x)) {
dosomething();
}
return x;
Тогда, это может реструктурировать этот код, чтобы быть чем-то больше как:
if (!x) {
return x;
}
dosomething();
return x;
преимущество этого - то, что, когда процессор берет ответвление в первый раз, существует значительно служебный, потому что он, возможно, теоретически загружал и выполнял код далее вперед. Когда это решит, что возьмет ответвление, тогда это должно делать недействительным это и запуститься в цели ответвления.
самые современные процессоры теперь имеют своего рода предсказание ветвлений, но который только помогает, когда Вы были посредством ответвления прежде, и ответвление находится все еще в кэше предсказания ветвлений.
существует много других стратегий, которые компилятор и процессор могут использовать в этих сценариях. Можно найти больше деталей о том, как предикторы ответвления работают в Википедии: http://en.wikipedia.org/wiki/Branch_predictor
Нашел (спросил ведущий)! Это 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.
Вы пробовали 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;
}
}