Статический против глобального с точки зрения скорости и потребления пространства в C

StackOverflow https://stackoverflow.com/questions/323094

Вопрос

Мне бы хотелось узнать разницу между статическими и глобальными переменными с точки зрения скорости доступа и потребления пространства . (Если вы хотите узнать мою платформу: компилятор gcc в Windows. (Я использую Cygwin с Triton IDE для встроенного программирования ARM7 в Windows. Triton поставляется с компилятором gcc на платформе Java, который можно запускать в Windows.))

(Очевидно, я знаю, что касается области файлов и функций из этот вопрос )

Изменить. Хорошо, дайте мне ответ на любом микроконтроллере / процессорной среде.

Это было полезно?

Решение

Разницы в площади нет, они занимают одинаковое количество.

Но есть разница в скорости: статика быстрее.

Конечно, доступ к памяти для переменной для глобальных и статических одинаков. Но компилятор может оптимизировать, когда у вас есть статические. Когда он компилирует модуль, он знает, что ни один вызов функции вне модуля не может изменить статическую переменную. Так что он точно знает, что происходит, и может, например, сохранить его в регистре по вызовам функций. Когда он глобальный и вы вызываете функцию из другого модуля, компилятор не может знать, что он делает. Следовательно, он должен предположить, что функция обращается к переменной и изменяет ее, что приводит к сохранению и перезагрузке.

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

Другие советы

Потребление места: в основном без разницы. Единственный раз, когда возникнет проблема с пространством, если вам удастся получить тот же кусок статических данных, скрытых в N объектных файлах, тогда вы получите коэффициент умножения N, где у вас может быть только 1 копия, если это будет один глобальный фрагмент данных. Однако это проблема неправильного дизайна. Сокрытие информации - это хорошо - если только информация не должна быть скрыта.

Скорость доступа: без разницы.

Трудно догадаться или оценить. Это, вероятно, займет время, но я бы сделал пример проекта и проверил скорость. Проверка скорости доступа и пространства с помощью цикла. Протестируйте пример проекта с эмулятором для этой архитектуры.

Я ожидаю, что любая разница возникнет из-за проблем с упаковкой (для пространства) и кэшированием (для скорости). И то, и другое также может возникнуть из-за чего-то еще.

В нет разницы, описанной вами, когда дело касается пробела . Статические или глобальные переменные занимают столько же памяти.

Из соображений скорости (, но это не очень хорошая практика ) вы можете предпочесть глобальные переменные , если вам нужен доступ к var вне одного файла. , (ссылка на использование external char my_global_char_placed_else_where; )

Для лучшей практики вы используете вместо этого функции get / set, но они работают медленнее. Тогда вы можете использовать макросы для получения / установки переменной, которая является глобальной, чтобы скрыть от читателя кода, что эта переменная на самом деле является глобальной, но это похоже на читерство. Но это может сделать код более читабельным.

Если вы сравниваете скрытие переменной внутри функции, то нет никакой разницы по сравнению с размещением ее вне функции, и больше функций может иметь доступ к переменной.

Я сам использую MSP430, ARM7 (только для тестов) и AVR32 micros для разработки

То, что говорит Джонатан, не совсем верно. Как статические, так и глобальные переменные будут (должны быть) сохранены в областях ZI (или данных RW). Компилятор не может "сохранить" строго по регистру - то, что он может сделать, это загрузить значение в регистр, использовать этот регистр для всех операций и затем сохранить это значение обратно - это специфическая оптимизация компилятора. И даже тогда, нет никаких причин, почему компилятор не будет делать это и для глобальных переменных: если, конечно, вы не сделаете его изменчивым. Но с технической точки зрения вы также можете сделать статическую переменную изменчивой, так что опять нет никакой разницы.

Редактировать: о да - пробел: без разницы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top