Мне интересно, как компилятор Microsoft Visual С++ обрабатывает/оптимизирует статические переменные.
Мой код:
#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;
}
Здесь сборка для кода (скомпилирована с оптимизацией):
Моя основная область интересов - последний случай.
Здесь первое утверждение полностью оптимизировалось, и два вызова второго оператора были встроены, и они фактически представляют собой аналогичные фрагменты кода.
Каждый из них выполняет test something something
, а затем делает короткий jump
, если тест не был успешным (эти прыжки, очевидно, указывают на конец соответствующей процедуры).
Является ли компилятор явной проверкой для каждого вызова функции, если функция вызывается в первый раз?
Есть ли у компилятора flag
, который указывает, является ли это впервые вызовом функции или нет?
Где он хранится (я думаю, что все, что test
материал об этом, но я не совсем уверен)?