Как компиляторы обрабатывают интерфейсы под капотом?

На высоком уровне я понимаю, что интерфейс — это способ сказать

Просто сделай это, мне все равно, как

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

Я понимаю эту концепцию, когда речь идет о языках высокого уровня, таких как Java.

Однако мне любопытно, как компиляторы работают с интерфейсами. Это может быть больший вопрос, чем я понимаю.

Вот моя теория: она основана на смещении в оперативной памяти.

Например, когда создается объект, который реализует интерфейс ICompare, который включает метод Compare, компилятор знает, что этот метод Compare нужно поместить в 16-байтовое смещение от того места, где этот объект начинается в ОЗУ. Фактически каждый объект, реализующий метод ICompare, имеет свой метод Compare в 16-м байте. Таким образом, когда другой код использует этот интерфейс для вызова метода Compare, система знает, что нужно выполнять инструкции в 16-м байте этого объекта.

Это то, как компилятор обрабатывает интерфейсы (используя стандартное местоположение в каждом объекте) или он использует какую-то таблицу поиска, чтобы узнать, где находится метод Compare объекта? Или какой-то другой метод совсем?


person Community    schedule 16.11.2017    source источник
comment
Таким образом, ответ высокого уровня - исследовать «vtables». Есть способы оптимизировать vtables, но в целом это то, что вам нужно.   -  person sircodesalot    schedule 16.11.2017
comment
blogs.msdn.microsoft.com/vancem/2006/03/13/   -  person Hans Passant    schedule 16.11.2017
comment
Отличные комментарии, спасибо. Этот ответ помог мне лучше понять vtables: stackoverflow.com/a/3555290/2363207. И этот комментарий был интересен по ссылке MSDN: .NET IL определяет нечто, называемое таблицей MethodImpl, которая представляет собой таблицу, которая для класса сопоставляет методы интерфейса с реализациями методов.   -  person    schedule 16.11.2017


Ответы (1)


Для всех, кто интересуется этим вопросом, здесь находится ОТЛИЧНОЕ видео с визуальным объяснением как vtables на самом деле реализованы в C++. Первые четыре байта объекта могут указывать на виртуальную таблицу, которая указывает на правильный метод, который следует использовать для этого конкретного класса.

Спасибо @sircodesalot за подсказку.

person Community    schedule 16.11.2017
comment
Объект с виртуальными функциями-членами можно хранить где угодно; статический, автоматический (стек) или куча (динамически выделенный. Он всегда имеет неявный указатель vtable в качестве первого члена независимо от того, где он хранится. См. Также Как объекты работают в x86 на уровне сборки? - person Peter Cordes; 17.11.2017
comment
Отличный ответ на этот пост, спасибо за ссылку. Мне нравится, когда ответы дают вам небольшие фрагменты кода, которые лаконично доказывают мою точку зрения. Видно, что они были очень хорошо продуманы. Спасибо! - person ; 17.11.2017