Глобальная нестатическая переменная в безымянном пространстве имен - PullRequest
3 голосов
/ 19 августа 2010

Я не могу найти хорошее объяснение глобальных нестатических переменных в безымянном пространстве имен. Я стараюсь избегать глобальных переменных. В данном конкретном случае меня интересует поведение только с чисто теоретической стороны.

Предположим, следующий код:

В часах

namespace ai {
  class Widget {
    void DoSomething(int param);
  };
}

В.cc

namespace {
  int x;
  void Helper() {
  }
}

namespace ai {
  void Widget::DoSomething(int param) {
    x = param;
    Helper();
  }
}
  1. Если бы я создал два экземпляра одного класса Widget, будут оба экземпляры имеют одну и ту же переменную x?

  2. То же самое поведение выше, если экземпляры класса находятся на том же нить против разных тем?

  3. Что если переменная x будет пользовательский тип вместо встроенного типа

  4. Когда переменная x будет создана, а когда уничтожена?

  5. Есть ли какая-либо связь между sizeof (Widget) и такими переменными?

  6. Какие аспекты определены в стандарте C ++, а какие нет?

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

Ответы [ 3 ]

5 голосов
/ 19 августа 2010

Если бы я создал два экземпляра одного класса Widget, будут оба экземпляры имеют одну и ту же переменную x?

Да. Это глобальная переменная. Всегда может быть один - на процесс, то есть.

выше поведение то же самое, если экземпляры класса находятся на том же нить против разных тем?

Глобальные переменные являются глобальными для процесса (не для потока).

Что если переменная x будет пользовательский тип вместо встроенного типа

Не имеет значения. (К счастью, в C ++ есть небольшие различия между встроенными модулями и UDT.)

Когда переменная x будет создана, а когда разрушена?

Создан до вызова main(), разрушен после. Порядок построения глобалов в нескольких единицах перевода не определен. В том же TU это порядок определения. (Или декларация? Я забыл.) Порядок уничтожения четко определен и, как всегда, порядок построения реверса.

Есть ли какая-либо связь между sizeof (Widget) и такими переменными?

Почему существует связь между классом X и переменной Y другого типа?

Какие аспекты определены в стандарте C ++, а какие нет?

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

4 голосов
/ 19 августа 2010
  1. Да, есть только одна переменная x.
  2. Да, есть только одна переменная x.
  3. Да, есть только одна переменная x.
  4. При запуске и при выключении.
  5. Я не слежу за вопросом.
  6. Я считаю, что 1-4 выше в Стандарте.

Это точно так же, как если бы вы определили его как static: глобальный внутри файла, но скрытый за его пределами.

static int x; 
namespace { 
  void Helper() { 
  } 
}

Неназванные пространства имен были добавлены специально, чтобы исключить частичное использование static (которое имеет слишком много разных значений / использований)

0 голосов
/ 19 августа 2010
  1. да. Пространство имен дало 'x' причудливое имя, но все еще является статическим объектом в глобальной области видимости.

  2. возможно. потоки не являются частью виртуальной машины iso c ++, описанной в документе стандартов. как c ++ взаимодействует с потоками - проблема, определяемая реализацией. Большинство компиляторов имеют своего рода директиву declspec, чтобы сделать переменные локальными, иначе все потоки имеют один и тот же экземпляр.

  3. Без разницы.

  4. х является int. его значение не определено / неинициализировано. если бы он был классом, он был бы создан до main () и уничтожен после.

5 & 6. Не понимаю вопроса.

У меня есть один ресурс для вопросов по c ++: c ++ faq lite

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