Статическая глобальная переменная, используемая встроенной функцией-членом

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

Однако, если я объявляю класс в том же файле заголовка и создаю функцию-член этого класса, встроенную в объявление класса, которая использует статическую глобальную переменную, например:

#include <iostream>

static int n = 10;

class Foo {
 public:
   void print() { std::cout << n << std::endl; }
};

, то я вижу немного странное поведение в gcc 4.4:

  1. Если я скомпилирую без оптимизации, все виды использования функции-члена используют копию переменной из одной из единиц трансляции (первая, упомянутая в командной строке g ++).

  2. Если я компилирую с -O2 , каждое использование функция-член использует копию переменной от перевода единицы, в которой сделан случай.

Очевидно, что это действительно плохой дизайн, так что этот вопрос просто из любопытства. Но, тем не менее, мой вопрос: что стандарт C ++ говорит об этом случае? Правильно ли ведет себя g ++, предоставляя другое поведение с включенной оптимизацией и без нее?

10
задан jchl 7 March 2011 в 10:47
поделиться