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

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

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

Ответы [ 3 ]

11 голосов
/ 01 мая 2010

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

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

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

3 голосов
/ 01 мая 2010

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

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

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

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

1 голос
/ 01 мая 2010

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

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

...