Да, обычно он переводится в неявный оператор if
с внутренним логическим флагом.Итак, в самой базовой реализации ваше объявление обычно переводится в нечто вроде
void go( int x ) {
static int j;
static bool j_initialized;
if (!j_initialized) {
j = x;
j_initialized = true;
}
...
}
Кроме того, если у вашего статического объекта есть нетривиальный деструктор, язык должен подчиняться другому правилу: такие статические объектыдолжны быть уничтожены в обратном порядке их строительства.Поскольку порядок построения известен только во время выполнения, порядок уничтожения также определяется во время выполнения.Таким образом, каждый раз, когда вы создаете локальный статический объект с нетривиальным деструктором, программа должна регистрировать его в каком-то линейном контейнере, который впоследствии будет использоваться для уничтожения этих объектов в правильном порядке.
Нет необходимостискажем, фактические детали зависят от реализации.
Стоит добавить, что когда речь идет о статических объектах «примитивных» типов (например, int
в вашем примере), инициализированных с помощью констант времени компиляции,компилятор может инициализировать этот объект при запуске.Вы никогда не заметите разницу.Однако, если вы возьмете более сложный пример с «не примитивным» объектом
void go( int x ) {
static std::string s = "Hello World!";
...
, то вышеупомянутый подход с if
- это то, что вы должны ожидать найти в сгенерированном коде, даже когда объектинициализируется константой времени компиляции.
В вашем случае инициализатор неизвестен во время компиляции, что означает, что компилятор должен отложить инициализацию и использовать неявный if
.