2016-01-12 6 views
2

Каковы (объективные) недостатки создания класса, в котором все члены (атрибуты, функции) являются статическими? В частности, по сравнению с использованием пространства имен? Или вы предпочитаете создавать глобальные переменные/функции?Глобальные переменные в современном C++

Мне нравится создавать статические атрибуты, потому что я нахожу их «более аккуратными». (Я точно знаю, откуда они, и т. Д.). Я не очень хорошо знаком с пространствами имен. И мне не нравится вообще глобальные переменные, потому что я не очень хорошо знаком с такими ключевыми словами, как extern и static.

Далее, если мы рассмотрим класс

class MyStaticClass 
{ 
    private: 

     static int x; 
     static double y; 

    public: 

     static float s; 
     static double weatherForecast(unsigned int, char); 
}; 

и пространство имен

namespace MyNamespace 
{ 
    int x; 
    double y; 
    float s; 
    double weatherForecast(unsigned int, char); 
} 
  1. Существует ли различие (производительность мудрая) между вызовом MyStaticClass::weatherForecast и вызовом MyNamespace::weatherForecast?

  2. Существуют ли различия между чтением/записью MyStaticClass::s и чтение/письмо MyNamespace::s?

  3. Был ли изменен любой из ответов на вышеуказанные вопросы, если вместо первичных типов были использованы классы?

+3

_ «Или вы скорее создали бы пространство имен?» _ Я думаю, что это общепринятая практическая практика сегодня. Но это может быть просто мнение. –

+2

зачем они вам нужны? Множество констант? + https://isocpp.org/wiki/faq/coding-standards#global-vars –

+0

https://google.github.io/styleguide/cppguide.html#Static_and_Global_Variables, это может быть полезно. – 88877

ответ

8

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

Это называется «monostate», и это зависит.

Или вы скорее создали бы пространство имен?

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

Или вы предпочитаете создавать глобальные переменные/функции?

Некоторые вещи поистине глобальны, как стандартные потоки, объекты Logger, механизмы цикла событий (поточно-зависимые глобальные). Например, код, который пропускает объекты Logger в каждом вызове или сохраняет их в качестве переменных-членов, более сложный, чем необходимо, IMO.

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


Ответы на ваши обновленные вопросы: нет, нет, нет.

+1

Особенно доволен развенчанием syngleton. – SergeyA

+0

Здравствуйте, спасибо за ваш ответ. Я обновил исходное сообщение и перечислил более точные вопросы. @MSalters – Pippin

+0

Недавно я прочитал, что на самом деле, Шварц-счетчик в некоторых случаях является нахмуренной техникой. Например, в стандартах кодирования проектов LLVM http://llvm.org/docs/CodingStandards.html они пишут: «Использование #include в библиотечных файлах запрещено, потому что многие распространенные реализации прозрачно вводят статический конструктор в каждый перевод который включает его ». Проблема в том, что весь этот статический init вызывает измеримую и ненужную стоимость запуска программы для каждой программы, которая ссылается на llvm. –

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