Это зависит.Обычно локальная декларация, такая как int x = 1;
, присваивается регистру и компилируется в инструкцию для загрузки константы 1 в этот регистр.Реже место в памяти будет выделяться в стеке, и значение будет храниться там.
Любая переменная может быть полностью оптимизирована, если компилятор (считает это) может доказать, что рефакторинг программы осуществляется таким образом.не изменит свое наблюдаемое поведение.Например, если вы пишете static const int ok = 0;
, то когда вы пишете x = ok;
, любой здравомыслящий компилятор просто установит x
на постоянную 0
.
Если вы берете адрес локальной переменной и разыменовываете его, компилятор должен поместить переменную в какую-то ячейку памяти.Константа, известная во время компиляции, может храниться в постоянной памяти текстового сегмента.Статическая локальная переменная обычно хранится с другими статическими переменными в сегменте данных.В противном случае он будет помещен в стек.
В более сложном случае, например
double matrix[4][3] = { { 1, 0, 0, -1 },
{ 0, 1, -1, 0 },
{ 9, 0, 0, 1 } };
Обычно вы видите начальные значения, хранящиеся в статическом массиве, а затем копируемые в память.расположение в стеке или в векторные регистры, если компилятор может векторизовать ваш алгоритм.Другими словами, это как если бы вы объявили начальные значения как локальный массив static const
, а затем скопировали их в рабочую копию.
Может показаться полезным поучаствовать в тестировании нескольких вариантов программы, таких как GodBolt .
double f (const double x)
{
double matrix[2][2] = { {1, 0},
{0, 1} };
double* const begin = &matrix[0][0];
const double* const end =
begin + sizeof(matrix)/sizeof(matrix[0][0]);
for ( double* p = begin; p < end; ++p ) {
*p *= x;
}
return (matrix[0][0] * matrix[1][1]) -
(matrix[0][1] * matrix[1][0]);
}
Компиляторы сильно различаются по тому, какой код они генерируют.GCC оптимизирует цикл и все переменные, кроме начальных значений массива, который он хранит в статической памяти по адресу .LC0
и копирует в регистры.Clang генерирует несколько векторных инструкций, которые, кроме регистров, вообще не выделяют память.Теоретически, хороший статический анализатор может оптимизировать эту функцию до return x*x;
.