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

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

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

7
задан Georg Fritzsche 1 May 2010 в 06:34
поделиться

3 ответа

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

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

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

11
ответ дан 6 December 2019 в 14:01
поделиться

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

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

1
ответ дан 6 December 2019 в 14:01
поделиться

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

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

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

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

3
ответ дан 6 December 2019 в 14:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: