статическая переменная, не являющаяся членом, будет ли она одинаковой для всех потоков в программе? - PullRequest
1 голос
/ 01 марта 2012

Мне не интересно, чтобы статический член загромождал мой заголовок, поскольку он должен использоваться только свободными функциями в теле cpp.Если я объявлю здесь статическую переменную, будет ли она когда-либо занимать только один адрес, как для статического члена?

Извинения, но бесчисленное количество использования статического в C ++ оставило меня совершенно неуверенным.

IЯ думаю по направлениям:

static Osp::Base::Runtime::Monitor sharedMonitor;

Ответы [ 2 ]

2 голосов
/ 01 марта 2012

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

0 голосов
/ 01 марта 2012

Во-первых, слово «статический» имеет два значения в C ++: оно может относиться к ключевому слову static (которое, в свою очередь, имеет разные эффекты в зависимости от того, где оно используется), или оно может относиться к времени жизни переменной: все переменные, определенные в пространстве имен, имеют статическое время жизни.

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

namespace {
int myWhatever;     //  No keyword static...
}

Переменные-члены класса, которые объявлены static, также имеют статическое время жизни, как и локальные переменные (внутри функции), которыеобъявляется static.

Такая переменная доступна везде после определения в единице перевода, но не где-либо еще.У него есть один экземпляр, который возникает в начале программы и длится до тех пор, пока программа работает.Если он имеет конструктор, конструктор будет вызываться до main (или при загрузке динамического объекта, если используется динамическое связывание), а его деструктор будет вызываться после вызова exit (или когда динамический объектвыгружается, если используется динамическое связывание).

Что касается потоков, C ++ 11 имеет спецификатор класса хранения thread_local: переменные, объявленные с этим спецификатором, имеют по одному экземпляру на поток с временем жизни, равнымэквивалент этого потока.Он будет инициализирован (создан) перед первым использованием и уничтожен при выходе из потока.Это что-то отличное от статического.

...