Вопрос

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

Проще говоря, представьте, что создается произвольный объект . Этот объект затем размещается в куче. Объект имеет свойство типа PointF (которое является типом значения), с методом get и set.

Представьте метод get и set, содержащий несколько вычислений для выполнения своей работы. Как и где (стек / куча) и когда создается этот код?

<Ч>

Это фон для этого вопроса:

Я пишу методы get и set для объекта, и к этим методам нужно обращаться очень часто. Сам по себе код get и set довольно массивный, поэтому я опасался, что в худшем случае методы будут реализованы как объект или тип значения со всем внутренним кодом для каждого доступа к свойству. С другой стороны, код, вероятно, создается при создании основного объекта, а ЦПУ просто передается jmp для запуска кода свойства. Во всяком случае, это то, что я хочу уточнить.

Это было полезно?

Решение

Методы (или свойства) не создаются. Вы, кажется, думаете, как я когда-то делал - создание экземпляра класса не только выделяет пространство для данных, но и для кода. Это не правда.

Даже в C ++ способ, которым это будет работать, заключается в том, что данные будут выделяться вместе с указателем на массив указателей функций - таблицу виртуальных функций или vtable. Записи в vtable будут указывать на виртуальные методы. Не виртуальным методам не потребуется запись в vtable.

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

Другие советы

У меня нет моей копии CLR через C # здесь с мне, но методы получения и установки свойств - это просто методы класса с особым оформлением. Отличная книга Джеффри Рихтера будет содержать все мельчайшие детали.

Исполняемый код не выделяется ни в стеке, ни в куче, он компилируется JIT'ером, когда это необходимо, и соответствующая память выделяется один раз . То есть вы беспокоитесь о том, что по сути не является проблемой. Кроме того, не пытайтесь угадать, что делает сборщик мусора в отношении выделения памяти - он поможет вам избавиться от беспокойства.

Они ничем не отличаются от методов.

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

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

Однако, как я объяснил выше, я хотел знать, будет ли программа страдать от снижения производительности, если я каким-либо образом использую свойства вместо функций. В целом я обнаружил, что свойства по какой-то необъяснимой причине в среднем примерно на 5% медленнее, чем функции. Это может быть потому, что свойства могут похвастаться целым рядом «невидимых» объекты, такие как дескрипторы свойств и тому подобное. Кроме того, реализации кажутся довольно похожими.

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