Меня интересует, как компилятор 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;
}
Вот сборка для кода (скомпилированная с оптимизацией):
My Основная область интереса - это последний случай.
Здесь первый оператор был полностью оптимизирован, а два вызова второго оператора были встроены, и они фактически представляют похожие фрагменты кода.
Каждый из них что-то тестирует
, а затем делает короткий прыжок
, если тест не удался (эти прыжки, очевидно, указывают на конец соответствующей процедуры).
Выполняет ли компилятор явную проверку при каждом вызове функции на предмет того, вызывается ли функция в первый раз?
Действительно ли у компилятора есть флаг
, который указывает, была ли функция вызвана впервые или нет?
Где он хранится (я думаю, все эти тестовые
материалы об этом, но я не совсем уверен)?