@Anton_repr

Статические методы вызываются быстрее?

Мне решарпер частенько предлагает заменить обычный метод/ на статический. Сегодня я узнал, что статические методы помечаются компилятором как имеющие не виртуальные площадки вызова, что предотвращает при каждом вызове метода проверку на то, не равен ли указатель на метод null.
Если статические методы вызываются быстрее, то, наверное, лучше всегда поля класса помечать как статик?
  • Вопрос задан
  • 320 просмотров
Решения вопроса 1
yarosroman
@yarosroman Куратор тега C#
C# the best
Боже упаси, где вы такую ахинею то прочли? Первое, нет никаких проверок перед вызовом метода, ибо указатель на него в принципе не может быть null, адрес метода уже известен на этапе компиляции. В IL есть две инструкции call и callvirt, первая служит для вызовов статических и не виртуальных методов, вторая, как раз для вызова виртуальных методов. Виртуальные методы явно помечаются virtual. Вызов виртуального метода более накладные, тем, что перед вызовом необходимо явно определить тип объекта и найти указатель на метод в его таблице виртуальных методов, у не виртуального, адрес метода уже известен на этапе компиляции.

Статический экземпляр класса это фактически другой объект, с другими полями и методами.

Я бы порекомендовал бы вам, первое - снести решарпер (подозреваю, у вас нет лицензии на него), ибо он больше отвлекает своими рекомендациями, второе - выучить шарп для начала, а потом в дебри clr залазить.

PS. Посидел тут в sharplab. Оказывается и для вызова методов экземпляра используется callvirt. И главное, чем он отличается. Проверяет указатель на экземпляр класса, а не указатель на метод. Но JIT так дико код оптимизирует, что, например, если есть явная инициализация объекта и его использование, то проверки выкидываются из кода, а то и функция может заинлайниться. Да и проверка состоит из одной команды процессора. Проверка на null делается в первом вызове метода, в остальных ее нет, при условии, что переменная не изменялась.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
Если статические методы вызываются быстрее, то, наверное, лучше всегда поля класса помечать как статик?
боже упаси!!!
.. ну или все таки разберитесь для начала:
- все что статик - один экземпляр на время работы одного экземпляра программы
- см пункт выше и включаем мозги
Ответ написан
Если нужно статическое поле - то выбирайте его.
Если у вас 10 объектов класса user, то конечно же поле money не должно быть статическим
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы