сравнение статических переменных по размеру

#c #static #size

#c #статическое #размер

Вопрос:

Рассмотрим следующие 3 программы:

  1. static1.c

      int main(int argc, char * argv[])
     {
         return 0;
     }
      
  2. static2.c

      int main(int argc, char * argv[])
     {    
         static int i;
         return 0;
     }
      
  3. static3.c

      int main(int argc, char * argv[])
     {  
         static int i = 2;
         return 0;
     }
      

Теперь вызывается размер для каждой программы:

  1. размер static1.out

     text    data     bss     dec     hex filename
    1418     544       8    1970     7b2 static1.out
      
  2. размер static2.out

     text    data     bss     dec     hex filename
    1418     544       8    1970     7b2 static2.out
      
  3. размер 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 и в случае . Или с другим компилятором. В чем именно вы обвиняете компилятор, если вы специально не указали ему, как себя вести?