sachin.vishwa90 Ответов: 3

В чем разница между статическим методом и обычным методом в классе с точки зрения выделения памяти?


Я нашел много различий в статическом и обычном методе, но большинство ответов были связаны с доступностью членов. Но есть и последствия для памяти и продолжительности жизни.
Может ли кто-нибудь сказать мне на хорошем примере, что происходит с оперативной памятью и продолжительностью жизни статических методов, когда мы создаем статический метод и нормальный метод?
Заранее спасибо.

Что я уже пробовал:

Уже знаете разницу между статическим классом и нормальным классом, статической функцией/членами и нормальными свойствами.

Philippe Mori

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

3 Ответов

Рейтинг:
1

Rob Philpott

И статические методы, и экземпляр-это просто биты кода, разница в том, что методы экземпляра всегда принимают по крайней мере один параметр "this".

Таким образом, с точки зрения самих методов, они занимают аналогичные объемы оперативной памяти. Эта оперативная память будет установлена при загрузке модуля (сначала как MSIL, а затем как машинный код после его Jitted) и будет там, как правило, до тех пор, пока процесс не умрет, забрав с собой свою оперативную память.

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


Рейтинг:
1

Rick York

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

Проблема со статическими членами заключается в том, что они должны быть созданы и инициализированы до вызова точки входа программы. Это происходит сразу после вызова различных DllMains и инициализации библиотек. Однако точное время этих событий не определено, поэтому по этой причине следует избегать использования RTL-функций для инициализации статических членов, поскольку они могут быть непредсказуемыми. Это относится и к глобальным объектам.


Rob Philpott

Привет, Рик, думаю, ты смотришь на это с точки зрения C++. В C# статические члены инициализируются только при первом обращении к типу и живут в области действия и времени жизни домена приложения, в котором они находятся.

Рейтинг:
0

F-ES Sitecore

Основными отличиями являются

1) статическая переменная существует в типе, поэтому, если у вас есть статическая переменная в MyObject и есть 100 объектов MyObject, то у вас есть только один экземпляр статической переменной. Если бы переменная не была статичной, то было бы 100 ее экземпляров.

2) статические переменные всегда находятся в куче, даже если они были бы в стеке, если бы они были нестатическими, поэтому даже если ваша статическая переменная является int, она все еще находится в куче и доступна как ссылочная переменная, так что это будет иметь эффект стука с точки зрения управления памятью и т. д.