Преимущество использования статической функции-члена вместо эквивалентной нестатической функции-члена?

Мне было интересно, есть ли какие-либо преимущества в использовании статической функции-члена, когда есть нестатический эквивалент. Приведет ли это к более быстрому выполнению (из-за того, что не нужно заботиться обо всех переменных-членах) или, может быть, к меньшему использованию памяти (из-за того, что он не включен во все экземпляры)?

По сути, функция, которую я рассматриваю, представляет собой вспомогательную функцию для поворота целочисленного массива, представляющего цвета пикселей, на произвольное число градусов вокруг произвольной центральной точки. Он помещен в мой абстрактный базовый класс Bullet, так как его будут использовать только пули, и мне не нужны накладные расходы на его вызов в каком-то служебном классе. Он слишком длинный и используется в каждом производном классе маркеров, что делает его, вероятно, не очень хорошей идеей для встраивания. Как бы вы предложили мне определить эту функцию? В качестве статической функции-члена Bullet, нестатической функции-члена Bullet или, может быть, не в качестве члена Bullet, но определенной вне класса в Bullet.h? Каковы преимущества и недостатки каждого из них?


person jonathanasdf    schedule 01.05.2010    source источник


Ответы (4)


Нет абсолютно никакой разницы в производительности между статическими функциями-членами и бесплатными функциями.

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

Что касается исходного вопроса, если функция явно не относится к определенному классу, то она должна быть свободной функцией. В лучшем случае он должен принадлежать пространству имен, чтобы управлять его областью действия. И даже если это относится к классу, в большинстве случаев я бы предпочел бесплатную функцию, если только функция не требует доступа к закрытым членам.

person Marcelo Cantos    schedule 01.05.2010
comment
да, я не совсем уверен, как работает С++. Я пришел из Flash, и ActionScript имеет ужасные накладные расходы в самых странных местах - статические функции в служебных классах разрешаются во время выполнения, поэтому, как и Math.sin, каждый раз, когда он используется, игрок должен найти класс Math через хэш-таблицу, а затем найти функция греха. Рад слышать, что C++, по крайней мере, имеет больше здравого смысла. - person jonathanasdf; 01.05.2010
comment
Действительно вы правы. Я прочитал строку, на которую отвечал, поскольку между функциями-членами и бесплатными функциями нет абсолютно никакой разницы в производительности. что на самом деле не то, что он говорит. Виноват. - person Zan Lynx; 02.05.2010
comment
только дополнительные усилия разработчиков - person bobobobo; 17.10.2010

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

Но есть одно исключение в функторах: классы, которые определяют operator(), чтобы объекты можно было "вызывать" как функции. Идиоматически такое operator() объявляется внутри блока class {}, что делает его inline.

Затем, если функция маленькая, она встраивается в вызывающую функцию, а указатель this оптимизируется.

Если функция большая, она может быть не встроена. Но крошечный недостаток наличия дополнительного аргумента, вероятно, в любом случае затмевается.

person Potatoswatter    schedule 01.05.2010

Если метод должен находиться в пространстве имен класса, но не работает с экземпляром этого класса (т. е. он не использует this и не использует какие-либо нестатические методы), его следует объявить static.

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

person Mike DeSimone    schedule 01.05.2010

Статическая функция: Преимущество:

  1. его можно было бы вызвать без существующего реального объекта
  2. Статические функции-члены становятся полезными, когда вы хотите, чтобы класс имел функцию в целом, а не каждый отдельный объект. Затем со статической функцией-членом вы можете изменить данные статической переменной.

Недостаток:

  1. у него нет указателя на реальный объект (этот)

Например: класс singleton (с приватным конструктором) — отличный пример использования преимущества статической функции.

person Ramanand Yadav    schedule 21.02.2021