IIRC, выравнивание стека - это когда переменные помещаются в стек, «выровненный» с определенным количеством байтов. Поэтому, если вы используете выравнивание по 16 бит, каждая переменная в стеке начнет с байта, который состоит из двух байтов из текущего указателя стека внутри функции.
Это означает, что если вы используете переменную, которая равна & lt; 2 байта, например char (1 байт), между ним и следующей переменной будет 8 бит неиспользуемого «дополнения». Это позволяет определенные оптимизации с допущениями на основе местоположений переменных.
При вызове функций один метод передачи аргументов следующей функции состоит в том, чтобы поместить их в стек (в отличие от их размещения непосредственно в регистры). Независимо от того, используется ли здесь выравнивание, важно, поскольку вызывающая функция помещает переменные в стек, чтобы считаться вызывающей функцией с помощью смещений. Если вызывающая функция выравнивает переменные, и вызываемая функция ожидает, что они будут не выровнены, тогда вызываемая функция не сможет их найти.
Кажется, что скомпилированный код msvc не согласен выравнивание переменных. Попробуйте выполнить компиляцию при выключенных оптимизациях.
Вы пытаетесь вычесть ссылки типа Object
.
Ваш тип элемента должен реализовать Comparable
:
public class ListElement<T extends Comparable<T>> implements Comparable<ListElement<T>> {
public T wert;
public ListElement<T> nachFolger;
public ListElement(T wert, ListElement<T> nachFolger) {
this.wert=wert;
this.nachFolger=nachFolger;
}
@Override
public int compareTo(ListElement<T> a) {
return wert.compareTo(a.wert);
}
}
В Java операция вычитания применяется только к числовым литералам (и автоматически распакованным числовым объектам). Когда вы пытаетесь использовать его для нечислового типа Object
, вы получаете ошибку. Если вы хотите сравнить два wert
значения, вы можете сделать следующее:
Измените тип на number
с Object
, чтобы вы могли сравнивать, например: [1112 ]
public Object wert;
@Override
public int compareTo(ListElement a) {
return wert.compareTo(a.wert);
}
Измените тип на Comparable
, чтобы вы могли использовать compareTo
для двух wert
объектов
public Comparable wert;
@Override
public int compareTo(ListElement a) {
return wert.compareTo(a.wert);
}