Я задавался вопросом, существуют ли какие-либо преимущества для использования статической функции членства, когда существует нестатический эквивалент. Это приведет к более быстрому выполнению (из-за не необходимости заботиться обо всех членских переменных), или возможно меньше использования памяти (из-за того, чтобы не быть включенным во все экземпляры)?
В основном функция, на которую я смотрю, является служебной функцией для вращения, целочисленный массив, представляющий пиксель, окрашивает произвольное число градусов вокруг произвольной центральной точки. Это помещается в мой абстрактный базовый класс Маркера, так как только маркеры будут использовать его, и я не хотел издержки вызова его в некотором служебном классе. Это немного слишком длинно и используется в каждом полученном классе маркера, делая, вероятно, не хорошей идеей встроить. Как Вы предложили бы, чтобы я определил эту функцию? Как статическая функция членства Маркера, нестатической функции членства Маркера, или возможно не как член Маркера, но определенный за пределами класса в Bullet.h? Каковы преимущества и недостатки каждого?
Нет абсолютно никакой разницы в производительности между статическими функциями-членами и бесплатными функциями.
С точки зрения дизайна, похоже, что рассматриваемая функция имеет мало общего с Bullets, поэтому я бы предпочел поместить ее где-нибудь в служебную библиотеку, это не требует дополнительных затрат времени выполнения, только дополнительные усилия разработчика, если вы у вас еще нет такой библиотеки.
Что касается исходного вопроса, если функция явно не относится к определенному классу, то это должна быть бесплатная функция. В лучшем случае он должен принадлежать пространству имен, чтобы управлять его областью. И даже если это относится к классу, в большинстве случаев я бы все равно предпочел бесплатную функцию, если только функция не требует доступа к закрытым членам.
Если метод должен находиться в пространстве имен класса, но не работает с экземпляром этого класса (т. Е. Не использует this
и не использует никаких нестатических методов), его следует объявить static
.
Я подумал, что несколько раз использовал статические методы, когда у меня был класс, который отслеживал свои экземпляры. Он использовал двусвязный список, конструктор вставлен, а деструктор удалил объект из списка. Сам объект имел предыдущие и следующие указатели в качестве членов, а первый и последний указатели были статическими членами, и все эти указатели были частными. Все методы, которые работали в списке, например поиск или подсчет, были статическими методами.
Обычно static
используется, если возможно, чтобы исключить необходимость в объекте и устранить посторонний аргумент this
.
Но одно исключение составляют функторы: классы, которые определяют operator ()
, чтобы объекты можно было «вызывать» как функции. Идиоматически такой operator ()
объявляется внутри блока class {}
, что делает его встроенным
.
Затем, если функция небольшая, она встраивается в вызывающую функцию, и указатель this
оптимизируется.
Если функция большая, она может не быть встроенной. Но ничтожный недостаток дополнительных аргументов, вероятно, в любом случае затмевается.