Я понимаю статические переменные, объявленные внутри функции:
- Если начальное значение не указано, статическая переменная будет находиться в
.bss
, иначе в.data
- The memory for statics are allocated along with globals - i.e., well before the execution enters
main
- are these two assumptions correct ?
- Когда выполнение попадает в функцию в первый раз, статика инициализируется заданным пользователем значением (или нулем, если начальное значение не указано).
- ... и они сохраняют свои значения при последующих вызовах функции
Но что, если я объявлю свою статическую переменную внутри блока if
? Я предполагаю, что моя третья точка должна быть обновлена до "когда выполнение достигает строки, где объявлена статическая переменная, они инициализируются ..." - я прав ? Strong >
Теперь, что, если блок if
, в котором они объявлены, никогда не попадает (и компилятор может это выяснить) - я понимаю, что переменная никогда не будет инициализирована; но выделяется ли какая-либо память для этой переменной?
Я написал две функции, чтобы попытаться понять, что происходит:
#include <stdio.h>
void foo()
{
static foo_var_out;
if(0){
static foo_var_in_0;
printf("%d %d\n", foo_var_in_0);
} else {
static foo_var_in_1;
printf("%d %d\n", foo_var_in_1);
}
}
static void bar(int flag)
{
static bar_var_out;
if(flag){
static bar_var_in_0;
printf("%d %d\n", bar_var_in_0);
} else {
static bar_var_in_1;
printf("%d %d\n", bar_var_in_1);
}
}
int main()
{
foo();
bar(0);
}
И взял дамп объекта:
$ gcc -o main main.c
$ objdump -t main | grep var
45:080495c0 l O .bss 00000004 foo_var_in_1.1779
46:080495c4 l O .bss 00000004 foo_var_out.1777
47:080495c8 l O .bss 00000004 bar_var_in_1.1787
48:080495cc l O .bss 00000004 bar_var_in_0.1786
49:080495d0 l O .bss 00000004 bar_var_out.1785
Судя по выходным данным, foo_var_in_0
вообще не был создан (предположительно, потому что он находится внутри явного if(0)
), тогда как bar_var_in_0
был создан (так как вызывающий может передать ненулевое значение, хотя единственный вызывающий явно передает нуль).
Думаю, мой вопрос: правильно ли предполагать, что для переменной foo_var_in_0
вообще не выделялась память? Я спрашиваю об этом конкретном случае; Правильно ли я читаю objdump - или мне нужно сделать что-то еще, чтобы проверить, займет ли переменная некоторая память во время выполнения программы?
Другими словами, если строка, в которой объявляется статическая переменная уровня функции, никогда не выполняется, действительно ли эта переменная вообще объявляется?
Если он вообще не будет создан, это в соответствии со стандартом C (менее вероятно) или оптимизацией времени компиляции и на каком уровне - как мне включить / выключить его (в gcc 4.1.1)?
Я понимаю, что один int - это не проблема, но меня больше интересует, как он работает; кроме того, что, если бы переменная была большим массивом размера, скажем, 5000 элементов 10-байтовой структуры?