Когда у вас есть статическая глобальная переменная в файле заголовка C ++, каждая единица трансляции, включающая файл заголовка, заканчивается своей собственной копией переменной.
Однако, если я объявляю класс в том же файле заголовка и создаю функцию-член этого класса, встроенную в объявление класса, которая использует статическую глобальную переменную, например:
#include <iostream>
static int n = 10;
class Foo {
public:
void print() { std::cout << n << std::endl; }
};
, то я вижу немного странное поведение в gcc 4.4:
Если я скомпилирую без оптимизации, все виды использования функции-члена используют копию переменной из одной из единиц трансляции (первая, упомянутая в командной строке g ++).
Если я компилирую с -O2
, каждое использование функция-член использует копию переменной от перевода единицы, в которой сделан случай.
Очевидно, что это действительно плохой дизайн, так что этот вопрос просто из любопытства. Но, тем не менее, мой вопрос: что стандарт C ++ говорит об этом случае? Правильно ли ведет себя g ++, предоставляя другое поведение с включенной оптимизацией и без нее?