Как MSVC оптимизирует использование статических переменных?

Меня интересует, как компилятор Microsoft Visual C ++ обрабатывает / оптимизирует статические переменные.

Мой код:

#include <cstdlib>

void no_static_initialization()
{
    static int value = 3;
}

void static_initialization(int new_value)
{
    static int value = new_value;
}

int main()
{
    no_static_initialization();
    static_initialization(1);
    static_initialization(std::rand());

    return 0;
}

Вот сборка для кода (скомпилированная с оптимизацией):

picture of the assembly listing

My Основная область интереса - это последний случай.

Здесь первый оператор был полностью оптимизирован, а два вызова второго оператора были встроены, и они фактически представляют похожие фрагменты кода.

Каждый из них что-то тестирует , а затем делает короткий прыжок , если тест не удался (эти прыжки, очевидно, указывают на конец соответствующей процедуры).

Выполняет ли компилятор явную проверку при каждом вызове функции на предмет того, вызывается ли функция в первый раз?
Действительно ли у компилятора есть флаг , который указывает, была ли функция вызвана впервые или нет?
Где он хранится (я думаю, все эти тестовые материалы об этом, но я не совсем уверен)?

13
задан tambre 16 September 2017 в 14:27
поделиться