#c #static #size
#c #статическое #размер
Вопрос:
Рассмотрим следующие 3 программы:
-
static1.c
int main(int argc, char * argv[]) { return 0; }
-
static2.c
int main(int argc, char * argv[]) { static int i; return 0; }
-
static3.c
int main(int argc, char * argv[]) { static int i = 2; return 0; }
Теперь вызывается размер для каждой программы:
-
размер static1.out
text data bss dec hex filename 1418 544 8 1970 7b2 static1.out
-
размер static2.out
text data bss dec hex filename 1418 544 8 1970 7b2 static2.out
-
размер static3.out
text data bss dec hex filename 1418 548 4 1970 7b2 static3.out
Почему выводимый размер одинаков для static1.c и static2.c, даже если в static2.out есть неинициализированная / инициализированная нулем статическая переменная, которая должна идти в сегмент .bss?
Во всех 3 программах переменная никогда не используется. Если компилятор достаточно умен, чтобы сделать это, то почему информация о размере в static3.c отличается от двух других?
Если .data и .bss равны 544 и 8 соответственно (без каких-либо переменных), то в static3.c должен измениться только сегмент .data, но из выходных данных мы можем видеть, что значение int переместилось из .bss в .data(поскольку переменная теперь имеет начальное значение)
Комментарии:
1. Вероятно, компилятор определил, что
i
это не используется в static2.c, поэтому нет необходимости выделять для него место. И я думаю, вы не заметили, чтоdata
это стало соответственно больше в static3.c.2. Как вы компилировали? Оптимизация имеет некоторый эффект…
3. Я скомпилировал с помощью -O0
4. И если вы скомпилируете с
-Os
, результат может быть другим. Как-Wunused-variable -Werror
и в случае . Или с другим компилятором. В чем именно вы обвиняете компилятор, если вы специально не указали ему, как себя вести?