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