Должен ли я сделать каждую функцию статической, которая не касается переменной-члена? - PullRequest
4 голосов
/ 26 мая 2011

Какое влияние оказывают Design и Performance на то, чтобы сделать все функции статичными, которые не касаются переменной-члена класса?

Ответы [ 7 ]

8 голосов
/ 26 мая 2011

На самом деле вам следует подумать о том, чтобы сделать их нестатическими свободными функциями, как подробно объясняется в этом вопросе . Этот вопрос также очень интересен.

В двух словах, этот вопрос объясняет, что вы должны отдавать предпочтение функциям, не являющимся друзьями, а не членам (если они не имеют доступа к закрытым членам).).

3 голосов
/ 26 мая 2011

Какое влияние оказывает дизайн и производительность на статичность всех функций, которые не касаются переменной-члена класса?

производительность: статические функции-члены могут быть немного быстрее, чем нестатические функции-члены, потому что им не нужно передавать указатель this, но вы вряд ли заметите разницу; там, где используется встраивание, может не быть ни одного. Кроме того, указатели на статическую функцию могут использоваться напрямую, тогда как «указатели» на нестатические функции-члены обычно являются смещениями / индексами и для использования требуют указатель this; можно ожидать, что задействованные операции ЦП будут несколько более сложными.

дизайн: выбор между статической и нестатической функцией-членом может быть безопасно сделан на основе необходимости доступа к данным нестатического члена-объекта для полного выполнения ожидаемой операции. Если вам, как правило, удобно работать с ООП, и не кажется интуитивно понятным и разумным вызывать функцию, используя обозначение object.fn(x, y, z), - что функция поддается восприятию как операция над текущим состоянием этого конкретного объекта - тогда она вероятно, не должен быть нестатичным членом.

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

0 голосов
/ 26 мая 2011

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

0 голосов
/ 26 мая 2011

Иногда имеет смысл сделать функцию виртуальной, даже если она не имеет доступа к каким-либо членам экземпляра - например, для возврата некоторых свойств, связанных с классом (что-то вроде virtual bool eatsPlants() в иерархии классов животных). Тогда он не может быть статическим, потому что в C ++ нет виртуальных статических членов.

0 голосов
/ 26 мая 2011

Абсолютно да .Нестатические функции-члены предназначены для обслуживания нестатических переменных-членов.Если переменные не используются, то следует сделать функцию static, которая сделает ваш дизайн чище, и вы можете избежать передачи this в качестве 1-го скрытого аргумента (что немного улучшает производительность).На смешной стороне есть одно заметное исключение:

struct A {
  virtual void foo (int) = 0;
};

Даже если у вас нет члена, используемого внутри foo(), вы не можете сделать это static!:)]

0 голосов
/ 26 мая 2011

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

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

0 голосов
/ 26 мая 2011

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

Производительность статических функций-членов по сравнению с нестатическими функциями-членами?
Обычно static member function используются для устранения необходимости в объекте и устранения постороннего аргумента this, и это единственная производительностьпреимущество перед non static member functions, но это едва заметно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...