Одним из определения привязки является то, что он является заменой имен функций адресами памяти.Почему виртуальные методы считаются ранними?
a) Таким образом, я предполагаю, что функции раннего связывания заменяются вызовами функций во время процесса компиляции, а при позднем связывании эта замена происходит во время выполнения?
b) Почему виртуальные методы также считаются ранними (таким образом, метод-метод найден во время компиляции, и создается код, который будет вызывать этот метод)? Насколько я знаю, с помощью виртуальных методов вызов фактического метода разрешается только во время выполнения, а не во время компиляции ?!
Thanx
EDIT:
1)
A a=new A();
a.M();
Насколько я знаю, это не известно во время компиляции, где в куче (таким образом, при котором адрес памяти) будет создан экземпляр a
во время выполнения. Теперь при раннем связывании вызовы функций заменяются адресами памяти во время процесса компиляции. Но как компилятор может заменить вызов функции с адресом памяти, если он не знает, где в куче будет создан объект a
во время выполнения (здесь я предполагаю, что адрес метода a.M
также будет в том же месте памяти, что и a
)?
2)
v-столовый звонки ни рано, ни поздно границы. Вместо этого есть смещение в таблицу указателей функций. Смещение фиксируется во время компиляции, но в какой таблице выбран указатель функции, зависит от типа среды выполнения объекта (объект содержит скрытый указатель на его v-таблицу), поэтому окончательный адрес функции находится во время выполнения.
Но если предположить, объект типа T
создается с помощью отражения (при этом приложение даже не знает о существовании типа T
), то как можно во время компиляции существует точка входа для данного типа объекта?
Я не уверен, что C# является правильным тегом для этого, так как C# не делает привязки, пока не будет загружено время загрузки. – Joshua