2014-01-02 2 views
1

Я знаю, что мы должны объявить функцию как статическую в классе, если ее функция-утилита или если мы должны использовать в одноэлементном классе для доступа к частному статическому члену.оптимизация компилятора статических функций C++

Но помимо этого статическая функция обеспечивает любую оптимизацию компилятора, так как она не пропускает «этот» указатель? Почему бы просто не использовать функцию утилиты через уже созданный объект класса? Или это просто лучшая практика, чтобы сделать функции полезности статикой?

Заранее спасибо.

ответ

1

Оптимизация «без пропусков», возможно, может быть выполнена компилятором после включения оптимизаций. Как я вижу, статическая функция имеет довольно идиоматические применения:

  • Реализация модулей. Здесь несколько совпадений с пространствами имен, и я предпочел бы использовать пространства имен.
  • Заводы: вы можете сделать конструктор защищенным/приватным, а затем создать несколько статических функций (с разными, явными именами), создающих экземпляры.
  • Для указателей функций: статические функции не требуют более сложного синтаксиса указателя на функцию-член. Это может быть плюсом при взаимодействии с библиотеками, написанными для C.
  • Чтобы не использовать this и укомплектовать его компилятором. Иногда это имеет смысл. Например, если у вас есть коммутативная операция, которая принимает два экземпляра, статическая функция, которая принимает два экземпляра, будет подчеркивать (на мой взгляд), что операция является коммутативной. Конечно, во многих случаях вы предпочитаете перегружать оператора.

В общем, статическая функция облегчит пространство имен и беспорядок «друг», префикс обычной обычной функции с именем класса, предположительно потому, что оба тесно связаны друг с другом.

1

Статические существует, чтобы связать метод с классом, а не как:

  1. Ассоциирования его с например этим классом (как написание нормальной, не-статической функции-члена).
  2. Сохранение его в глобальном пространстве имен или в любом пространстве имен, в котором вы были бы в противном случае (например, объявление функции только в файле, а не в классе).

Статик говорит, что «концептуально это что-то связано с/с этим классом, но оно не зависит от какого-либо экземпляра этого класса».

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

Возвращаясь к вашему вопросу:

  1. Там нет никакой выгоды оптимизации здесь.
  2. Полезная функция не имеет к этому никакого отношения. Это имеет смысл охватить функцию в самом классе (а не в качестве экземпляра).
  3. Он не передает этот указатель, потому что нет экземпляра, о котором можно было бы говорить.Вы можете вызвать статическую функцию-член без вызова конструктора этого класса.
+0

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

+0

Я вижу, ваш вопрос относится к тому, что я бы назвал «вспомогательными функциями». Я бы сказал, что разница все та же: если вам нужен экземпляр класса в этой функции, скорее всего, он не должен быть статической функцией, если вам не нужен экземпляр класса, идите статически. – Mark

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