Помогают ли статические элементы эффективности памяти?
Если у меня есть класс, который, как я предполагаю, будет использоваться в тысячах экземпляров в приложении, чувствительном к памяти, помогает ли мне отбрасывать статические функции статическим членам?
Я предполагаю, что статические методы и переменные хранятся один раз для каждого класса, тогда как для нестатических членов там должно быть что-то, хранящееся для каждого экземпляра.
С переменными-членами, кажется совершенно ясным, но какие данные хранятся для методов?
Я работаю на Java, но я предполагаю, что некоторые общие правила применяются и в других управляемых средах (например,.NET).
Ответы
Ответ 1
Единственная разница между статическими методами и нестационарными (экземплярами) методами за кулисами заключается в том, что дополнительный, скрытый параметр (this
) передается методам экземпляра и что методы экземпляра могут быть вызваны с использованием косвенной отправки (если виртуальная). Дополнительного кода не требуется.
Edit:
Мой ответ был посвящен методам, но при более близком чтении я вижу, что вопрос касается более статических данных. Да, статические данные будут в некотором смысле экономить память, поскольку есть только одна ее копия. Конечно, независимо от того, являются ли данные статическими, это больше зависит от значения или использования данных, а не от экономии памяти.
Если вам нужно иметь большое количество объектов и вы хотите сохранить память, вы можете также изучить, используете ли 'Weightweight' pattern применимо.
Ответ 2
Решение не должно приниматься на основании эффективности - оно должно быть сделано на основании правильности.
Если ваша переменная представляет собой отдельное значение для каждого экземпляра, она должна быть переменной экземпляра.
Если ваша переменная является общим значением, связанным с типом, а не с отдельным экземпляром типа, это должна быть статическая переменная.
Вы правы, однако, если у вас есть статическая переменная, вы не будете платить за это с каждым экземпляром. Это просто добавляет дополнительную причину, чтобы сделать переменными static, где они не представляют собой часть состояния объекта.
Когда вы упоминаете методы в своем вопросе, говорите ли вы о локальных переменных? Вы получите новый набор локальных переменных для каждого вызова метода - включая рекурсивные вызовы. Однако это не создает новый набор переменных static или экземпляра.
Ответ 3
Простой ответ - да. Создание экземпляра каждый раз, когда нет равных, воссоздает весь объект, статические методы и переменные обычно потребляют меньше памяти в зависимости от того, как они используются. Конечно, если вам нужно всего лишь создать один экземпляр на протяжении всей вашей программы, нет никакой разницы. И помните, что вы всегда можете передавать экземпляры в качестве ссылок, где у вас не может быть статических объектов, и вам нужно их повторно использовать.
Ответ 4
Если вы создаете переменную-член, статическую, вы сохраняете память для каждого экземпляра (предполагая, что существует более одного экземпляра), но реальный выигрыш заключается в том, что вам не нужно работать, чтобы сохранить все эти нестатические элементы в соответствии с каждым другой, и вам не нужен текущий экземпляр для доступа к статическому члену.
Если вы создаете метод static, вы сохраняете несколько байтов в стеке для каждого вложенного вызова (нет неявного параметра 'this'), но это актуально только в том случае, если вы делаете очень тяжелую рекурсию. Конечно, если функция должна знать, к какому экземпляру вы имеете дело, вам понадобится явный параметр для замены неявного 'this', так что вы ничего не получите.
Не существует затрат на экземпляр для статического метода или, если на то пошло, нестатического метода. Затраты происходят при звонках.
Настоящая причина использования статического метода заключается в том, что нет экземпляра - по крайней мере, когда вы вызываете метод. Например, вы можете использовать статический метод для создания и инициализации экземпляров (один из шаблонов дизайна "factory" ) или ссылки на экземпляр singleton.