2010-05-01 4 views
6

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

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

ответ

9

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

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

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

+0

Да, я не уверен, как работает C++. Я исхожу из флэш-фона, и ActionScript имеет ужасные накладные расходы в самых странных местах - статические функции в классах утилиты разрешаются во время выполнения, так что, как и Math.sin каждый раз, когда он используется, игрок должен найти класс Math через хэш-таблицу, а затем найти функция sin.Рад слышать, что C++ по крайней мере имеет более распространенный смысл. – jonathanasdf

+3

@Zan: статические функции-члены не имеют указателя 'this'. –

+0

Действительно, вы правы. Я прочитал строку, на которую я отвечал как «Нет абсолютно никакой разницы в производительности между функциями-членами и свободными функциями». на самом деле это не так. Виноват. –

1

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

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

3

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

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

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

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

Смежные вопросы