Предлагаю Нестандартную Анкету На .Net

Предлагаю не совсем стандартный опрос на платформе .

Net. Спойлеры раскрывают ответы на вопросы, но я все равно прошу сначала самостоятельно ответить на анкету, а потом идти и смотреть ответы :) Когда вызывается статический метод, JIT. JIT компилирует вызов прокси-метода, который осуществляет безусловный переход к требуемому компилятору, и заменяет адрес перехода в прокси новым телом метода.

Это делается по нескольким причинам.

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

Фактически меняется только адрес, по которому происходит jmp. Перед компиляцией метода адрес указывает на компилятор этого метода (поэтому компиляция происходит при первом вызове).

Затем, когда компиляция завершена, аргумент команды jmp меняется с адреса компилятора на адрес целевого, уже скомпилированного метода.

Преимущества очевидны: поскольку прокси – содержит одни и те же инструкции, то группу методов можно рассматривать как таблицу с двумя полями: Код и Адрес перехода с одной стороны, и не меняющие адреса инструкций вызова метода – с другой.

Что происходит при наборе в класс? Приведение типа к базовому типу - ничего не происходит, приведение к унаследованному - сначала проверяется возможность приведения и работа с объектом будет идти по той же таблице виртуальных методов, что и раньше Приведение к типу — это синтаксический сахар языка, не имеющий почти ничего общего на уровне структуры объектов в памяти.

Поскольку объект состоит из полей + SyncBlockIndex + MethodsTablePtr, где MethodsTablePtr отвечает за указатель на описание типа объекта, то при помещении указателя на объект в переменную другого типа с объектом ничего не происходит ( тип объекта не меняется).

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

Нужно проверить.

Проверка осуществляется путем перехода к таблице методов и прохода по цепочке указателей ParentClassMethodsTable до тех пор, пока либо не встретится Object (тогда приведение невозможно), либо пока не встретим указатель, равный искомому.

Как вызывается виртуальный метод, хорошо описано здесь: Вики Что происходит, когда вы приводите тип к интерфейсу В таблице типов есть ссылка на интерфейсный словарь, и чтобы проверить возможность приведения, нужно пройтись по ней всю.

Нет необходимости рассматривать основные типы, потому что.

все они также присутствуют в словаре.

Если совпадение найдено, в регистр будет загружен адрес таблицы виртуальных методов интерфейса, а не тип объекта.

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

По сути, это список ссылок на таблицы виртуальных методов каждого из них.

При приведении типа поиск нужной таблицы осуществляется методом бинарного поиска, так как поиск осуществляется по равенству указателя на требуемый (среди списка наличие нужного нам указателя на осуществляется поиск таблицы виртуальных методов).

Если он найден, в регистр загружается указатель на эту таблицу и далее через него вызывается метод (таблица содержит адреса методов класса.

Поэтому для каждой реализации интерфейса присутствует список методов в таблицах всех классов, реализующих интерфейс, а также всех потомков классов и интерфейсов) В чем разница между неявными и явными интерфейсами? Оба выделены в словарь интерфейса, но явных методов нет в таблице виртуальных методов класса, только в словаре интерфейса.

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

Однако существуют и явные реализации, когда методы отделены от класса.

Такие методы отсутствуют в таблице виртуальных методов класса.

Однако в обоих случаях мы имеем право выполнить приведение к интерфейсу и работать через него.

Это значит, что они будут присутствовать в карте интерфейсов обоих типов вместе со всеми базовыми типами — интерфейсами.

Потоки в .

Net являются потоками платформы MS Windows, поэтому цена переключения между потоками равна общей цене для Windows Здесь вообще без комментариев.

Сборщик мусора не может вмешиваться в общий процесс обслуживания многопоточного кода.

Приложения .

Net работают как обычные приложения Windows. Общие типы JIT создает для каждого параметра типа классы, никак не связанные друг с другом.

Поскольку JIT ничего не может знать о логике приложения, она не может рассуждать так:

   

IEnumerable<object> a = new List<int>()

это должно как-то работать.

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

Если представить вызов метода, то на уровне процессора это будет происходить с использованием нотации fastcall: первые два параметра метода пойдут в регистры, а остальные — в стек.

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

чтобы исправить ситуацию, мы всегда передаем this первым параметром, а в языке программирования (например, C#) просто не показываем его, вводя локальную переменную this, которая присутствует всегда, независимо от желания программиста.

Фактически это первый параметр метода.

Типы значений и ссылок.

В чем разница? Типы значений располагаются как в стеке, так и в куче, а ссылочные типы — только в куче.

Они отличаются тем, что значение передается по значению, а ссылка передается по ссылке.

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

с правильными данными.

Поле класса (даже если оно имеет тип Value) всегда находится в куче.

Разница между типами Value и Ref заключается в том, что при копировании типов Ref копируется ссылка, а при копировании типов Value копируется вся структура.

Второе отличие: неупакованные типы Value не имеют полей MethodsTable и SyncBlockIndex. Где находятся статические переменные? Они лежат во внутренних массивах, и доступ к ним осуществляется по ссылке на массив + индекс.

Это просто священное знание.

Просто так сделано и всё.

Как называются виртуальные методы? JIT создает таблицу виртуальных методов типа, через которую осуществляется вызов с заранее рассчитанным индексом С наследованием и наличием виртуальных методов получается так: от класса к классу их можно только добавлять по наличию, не пропадая в никуда.

При этом в каждом последующем классе гарантированно присутствуют все методы всех базовых.

С одной разницей — при наследовании метод можно переопределить.

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

Если метод не переопределен, то адрес тела метода в таблице будет совпадать с адресом этого метода в таблице базового класса.

Если метод переопределен, значение будет другим.

После всех методов базовых классов будут методы текущего класса.

А сам вызов будет выглядеть так:

  • Загрузите адрес таблицы виртуальных методов.

  • Перейти в начало списка методов
  • взять адрес метода по индексу (например) 1
  • Позвони ему.

Более того, поскольку при наследовании на этом месте всегда будет находиться метод ToString(), даже при его переопределении в потомках, то будет вызываться метод ToString(), но не базового класса, а потомка.



Предлагаю нестандартную анкету на .
</p><p>
Net

В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

При вызове статического метода тогда: 40,72% JIT компилирует прямой вызов метода 125 14,66% JIT компилирует прямой вызов прокси-метода, который безоговорочно переходит к первоначально вызванному 45 30,62% JIT компилирует вызов прокси метод, совершающий безусловный переход к компилятору нужного и заменяющий в прокси адрес перехода на новое тело метода 94 14,01% JIT компилирует вызов компилятора, который при вызове меняет все точки своего вызова к вызову скомпилированного метода 43 Проголосовали 307 пользователей.

146 пользователей воздержались.

В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

Если происходит приведение к типу класса: 25,27% Приведение типа к базовому типу - ничего не происходит, а если к унаследованному - сначала проверяется возможность приведения и работа с объектом будет идти по той же таблице виртуальных методов как и раньше 71 43,06% Приведение типа к базовому - ничего не происходит, а если к унаследованному - сначала проверяется возможность приведения и работа с объектом будет идти по таблице виртуальных методов нового типа 121 9,61% В обоих направлениях приведения типов: первая проверка, после чего работа с объектом продолжится без изменения таблицы виртуальных методов 27 22,06% В обоих направлениях приведения типов: первая проверка, после чего работа с объектом продолжится с изменением таблицу виртуальных методов к новому типу 62 Проголосовал 281 пользователь.

84 пользователя воздержались.

В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

Если есть приведение к типу интерфейса: 23,3% Интерфейс присутствует среди базовых типов, так что это обычный вызов виртуального метода: ничего делать не нужно 41 18,75% В таблице типов есть ссылка на словарь интерфейса и для проверки возможности кастинга нужно пройти его весь плюс пройтись по всем базовым типам каждого из них, чтобы они были равны целевому типу.

Если совпадение найдено, в регистр будет загружен адрес виртуальной таблицы методов интерфейса, а не тип объекта 33 20,45% В таблице типов есть ссылка на словарь интерфейса и для проверки возможности приведения нужно пройти через все это плюс пройти все базовые типы каждого из них на равенство с целевым типом.

Если совпадение найдено и регистр загружен, адрес виртуальной таблицы методов исходного объекта 36 1,14% Имеется инструкция процессора, которая решает, что будет вызываться, а память построена таким образом, что процессор все понимает 2 36,36% В таблице типов есть ссылка на словарь интерфейса и для проверки возможности кастинга нужно все это обойти.

Нет необходимости рассматривать основные типы, потому что.

все они также присутствуют в словаре.

Если совпадение найдено, в регистр будет загружен адрес таблицы методов виртуального интерфейса, а не тип объекта.

64 Проголосовали 176 пользователей.

91 пользователь воздержался.

В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

Потоки в .

Net: 14,24% — это полностью свои, так называемые «тонкие» потоки.

Поэтому переключение контекста между потоками ничего не стоит 41 52,43% — это потоки платформы MS Windows, поэтому стоимость переключения между потоками равна общей цене на Windows 151 33,33% — это потоки платформы, однако при переключении активного потока .

NET Платформа также выполняет код, необходимый для GC, поскольку многопоточные приложения .

Net работают медленнее.

96 Проголосовали 288 пользователей.

75 пользователей воздержались.

В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

Универсальные типы (без ввода/вывода) 56,79% JIT реализует классы, никак не связанные друг с другом для каждого параметра типа.

138 10,7% JIT создает один тип и разные наборы методов — внутри него 26 32,51% JIT создает один тип и единый код для всех вариантов универсальных параметров, различия есть только в C# 79 Проголосовали 243 пользователя.

67 пользователей воздержались.

В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

Как вызываются методы экземпляра 24,91% это поле класса и хранится в экземпляре класса 66 9,06% это хранится в специальном массиве внутри структур GC и доступно по индексу 24 66,04% это первый параметр метода, который не отображается для синтаксических целей.

Проголосовали 175 265 пользователей.

66 пользователей воздержались.

В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

Типы Value и Reference 29,06% Типы Value находятся в стеке, Reference — в куче 102 77,21% Типы Value находятся и в стеке, и в куче, а Reference — только в куче.

Они отличаются тем, что значение передается по значению, а Reference передается по ссылке 271 Проголосовал 351 пользователь.

56 пользователей воздержались.

В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

Статические переменные 16,43% Они расположены в obj-MethodsTable-> EEClass-> storage и вызов каждый раз проходит по всей цепочке, поскольку GC может переместить любую из структур в памяти 35 35,21% Они лежат во внутренних массивах и доступны через ссылка на массив + индекс.

75 48,36% Они лежат в отдельно выделенной области виртуальной памяти, доступ к которой осуществляется по прямой ссылке.

Проголосовали 103 213 пользователей.

87 пользователей воздержались.

В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

При вызове виртуального метода 4,78% JIT создает вызов по прямой ссылке 11 38,26% JIT создает таблицу виртуальных методов для типа, через который проходит вызов, рассчитывая индекс на лету 88 56,96% JIT создает таблицу виртуальных методов для тип, через который идет звонок заранее рассчитанный индекс 131 проголосовали 230 пользователей.

63 пользователя воздержались.

В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

В чем разница между неявными и явными интерфейсами? 19,61% На уровне звонков – нет. Все работает через словарь интерфейсов 40 15,69% Неявные интерфейсы не видны на уровне таблицы виртуальных методов и являются частью типа.

Явно видны, потому что выделены из словаря интерфейса 32 64,71% Оба выделены в словарь интерфейса, но Явных методов нет в таблице виртуальных методов класса, только в словаре интерфейса 132 Проголосовали 204 пользователя.

90 пользователей воздержались.

Теги: #опрос #.

NET #C++

Вместе с данным постом часто просматривают: