2008-11-27 8 views
5

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

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

Редактировать: OK дайте мне ответ на любую микроконтроллер/среду процессора.

ответ

10

Нет разницы в пространстве, они принимают ту же сумму.

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

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

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

1

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

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

1

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

+0

Глядя на сборку, составленную компилятором, также будет отображаться. – 2008-12-15 21:39:18

1

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

0

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

Для скорости соображений (, но не хорошая практикой) вы могли бы предпочитают глобальные переменные, если вам нужен доступ к вару вне одного файла. (ref use of external char my_global_char_placed_else_where;)

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

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

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

+0

Спасибо Джонатан Леффлер – eaanon01 2008-11-28 13:02:44

0

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

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