Вопрос

C ++ имеет несколько наследство. Реализация многократного наследования на уровне сборки может быть довольно сложной, но есть хорошие описания Онлайн на то, как это нормально сделано (vtables, указатели Fixups, Thunks и т. Д.).

Java не имеет нескольких наследований внедрения, но у него есть несколько наследний интерфейса, поэтому я не думаю, что прямая реализация с одним классом может реализовать его. Как Java реализует интерфейсы внутри страны?

Я понимаю, что наоборот C ++, Java - это скомпилирован JIT, поэтому различные кусочки кода могут быть оптимизированы по-разному, а разные JVMS могут делать вещи по-разному. Итак, есть ли какая-то общая стратегия, на которую следуют многие JVMS, или кто-нибудь знает реализацию в конкретном JVM?

Также JVM часто дежинуализуют и встроенные вызовы методов, и в этом случае нет VTables или эквивалентных вообще, поэтому, возможно, не имеет смысла спрашивать о фактических последовательностях сборки, которые реализуют вызовы метода виртуального / интерфейса, но я предполагаю, что большинство JVMS все еще сохраняют некоторые Вроде общего представления классов вокруг использования, если они не смогли расти в целом. Это предположение неправильно? Это представление выглядит так, как C ++ VTable? Если то есть интерфейсы имеют отдельные VTables и как эти связаны с классом VTables? Если это возможно, могут ли объектные экземпляры имеют несколько указателей VTable (к классу / интерфейсу VTable), таких как экземпляры объектов в C ++ CAN? Ссылки на тип класса и тип интерфейса к тому же объекту всегда имеют одинаковое двоичное значение или они могут отличаться как в C ++, где они требуют фиксации указателя?

(для справки: этот вопрос спрашивает что-то похожее на CLR, и там, кажется, хорошее объяснение в Эта статья MSDN Хотя это может быть устаревшим сейчас. Я не смог найти ничего подобного для Java.)

Редактировать:

  • Я имею в виду «реализует» в смысле «Как компилятор GCC реализует целочисленное дополнение / функцию вызовов / и т. Д.», а не в смысле «Arraylist Java Class Arraylist реализует интерфейс списка».
  • Я знаю, как это работает на уровне Bytecode JVM, то, что я хочу знать, это то, какой код и Datastructures генерируются JVM после того, как это сделано загрузка файлов классов и составление байтека.
Это было полезно?

Решение

Ключевая особенность HotSpot JVM встроенная кэширование. Отказ Это на самом деле не означает, что целевой метод включен, но означает, что предположение вводится в код JIT, что каждый будущий вызов на виртуальный или интерфейсный метод будет нацелен на то же самое реализацию (то есть, что сайт вызова мономорфной). В этом случае чек скомпилирован в машинный код, действительно ли удерживает предположение (т. Е. Тип целевого объекта такой же, как было в последний раз), а затем передавать управление непосредственно на целевой метод - без виртуальных таблиц вовлечен вообще. Если утверждение не удается, может быть предпринята попытка преобразовать это на мегаморфический сайт вызова (т.е. с несколькими возможными типами); Если это также не удается (или если это первый вызов), проводится обычный долговечный поиск, используя VTable (для виртуальных методов) и случаи (для интерфейсов).

Редактировать: То Hotspot Wiki Имеет более подробную информацию о VTable и Itable stubs. В полиморфном случае он по-прежнему ставит встроенную версию кэша в сайт вызова. Тем не менее, код на самом деле представляет собой заглушку, который выполняет поиск в VTBAL или имеющем. Существует одна заглушка VTable для каждого смещения VTable (0, 1, 2, ...). Интерфейсные звонки Добавьте линейный поиск на массив смущных элементов, прежде чем посмотреть в присмотр в тему (если он найден) в данном смещении.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top