Нет разницы для места, они занимают одинаковое количество.
Но есть разница в скорости: статика быстрее.
Конечно, доступ к памяти для переменной для глобальных и статических одинаков. Но компилятор может оптимизировать, когда у вас есть статические. Когда он компилирует модуль, он знает, что ни один вызов функции вне модуля не может изменить статическую переменную. Так что он точно знает, что происходит, и может, например, сохранить его в регистре по вызовам функций. Когда он глобальный и вы вызываете функцию из другого модуля, компилятор не может знать, что он делает. Следовательно, он должен предположить, что функция обращается к переменной и изменяет ее, что приводит к сохранению и перезагрузке.
С помощью gcc вы можете одновременно передавать все .c
источники, поэтому он также может видеть, что происходит при вызове функций для функций из разных модулей. Чтобы это работало, вы должны передать все .c
файлы одновременно -combine
и -fwhole-program
. -fwhole-program
делает все глобальные переменные статическими (не статическими, а статическими модулями компиляции, то есть все указанные файлы .c
вместе) -combine
выполняет межмодульный анализ.