Разница между «глобальным» и «статическим глобальным» - PullRequest
23 голосов
/ 06 июня 2009

A глобальная переменная * Область видимости присутствует во всех файлах, а static глобальная переменная - это просто файл, в котором она объявлена. Почему так?

Где хранятся глобальные или статические глобальные переменные в памяти?

Ответы [ 7 ]

28 голосов
/ 06 июня 2009

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

Внутренняя связь для функции или объекта означает, что если вы объявите другую функцию в другом «файле» (это на самом деле не называется «файл», а скорее единицей перевода - TU), то это объявление будет ссылаться на a Другая функция: Имя, объявленное в этом модуле, будет «связывать» с другим объектом, чем имя, объявленное в этом другом модуле перевода, которое было «внутренним» для этого TU. То же относится и к объектам.

Независимо от того, объявлена ​​ли переменная области файла с static, она все равно будет иметь статическую продолжительность хранения: это означает, что она проходит всю программу и умирает после ее завершения. Другой пример объекта со статической продолжительностью хранения - строковый литерал. Где хранятся объекты со статической продолжительностью хранения, не указано, но они обычно хранятся в зависимости от того, инициализированы они или нет: переменные области видимости файла обычно хранятся в разделе с именем «.data», а неинициализированный файл Переменные -scope обычно хранятся в разделе ".bss". Помните, что если переменная не инициализирована, она будет инициализирована нулем в начале программы: раздел «.bss» обычно инициализируется нулем при реализации программы при запуске программы.

Я сказал «обычно» везде, так как место хранения вещей не указано. Например, некоторые реализации могут хранить строковые литералы в разделе только для чтения. И если у вас есть указатель области видимости файла и вы не инициализируете его, реализация инициализирует его нулевым указателем, который не обязательно является объектом со всеми нулевыми байтами:)

18 голосов
/ 06 июня 2009

Они оба хранятся в сегменте данных; Разница в том, что глобал имеет внешне видимый символ компоновщика, а статический глобал - нет.

7 голосов
/ 06 июня 2009

Область действия глобальной переменной есть во всех файлах ... в то время как область действия статической глобальной переменной - это просто файл, в котором она объявлена ​​... почему так?

Предполагается, что глобальная переменная доступна из любого модуля - такая практика считается плохой, и ее следует использовать только в случае крайней необходимости.

Статические переменные в области файлов (о чем я предполагаю, что вы говорите, когда говорите «статический глобальный»), могут быть доступны для подпрограмм в одном модуле компиляции (обычно в файле) - причина этого заключается в ограничении области действия , При изменении кода, использующего переменную, есть хороший предел того, где вам нужно искать, чтобы увидеть, какие другие подпрограммы могут быть затронуты. Это также уменьшает возможность столкновения имен.

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

6 голосов
/ 17 июля 2013

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

1 голос
/ 15 июня 2016

Очки, которые нужно запомнить, чтобы взломать вопросы интервью по статическому и глобальному

  1. Память, выделенная для статических переменных, только однажды, то есть все объекты, совместно используемые одной и той же памятью, но когда дело доходит до глобальных переменных, память выделяется для каждого объекта.
  2. Статические и глобальные переменные различаются по времени жизни и области применения. Сначала позвольте мне объяснить, что такое жизнь и сфера применения. Жизнь объекта определяет, находится ли объект в памяти, в то время как область действия объекта заключается в том, может ли он получить доступ к переменной по его имени. A) Возможно, что объект является живым, но не видимым (не в области видимости). B) Если объект не живой, но находится в области видимости (за исключением динамически размещаемых объектов, на которые вы ссылаетесь с помощью указателей).
  3. Глобальная переменная имеет глобальную область видимости, я имею в виду, что к ней может обращаться любая функция из любого файла, в то время как статическая переменная имеет область видимости файла, доступ к переменной из любого другого файла невозможен. Этот метод полезен, когда вы хотите сделать переменную доступной для всех функций этого файла, но не для функций другого файла.
1 голос
/ 06 мая 2015

Мы используем статический атрибут, чтобы скрыть объявления переменных и функций внутри модулей, так же, как мы использовали бы публичные и частные объявления в Java и C ++. C исходные файлы играют роль модулей. Любая глобальная переменная или функция, объявленная со статическим атрибутом, является закрытой для этого модуля. Точно так же любая глобальная переменная или функция, объявленная без статического атрибута, является общедоступной и может быть доступна любому другому модулю. Хотя рекомендуется определять переменные или функции с помощью ключевого слова global.

Обе эти переменные хранятся в разделе .data или .bss перемещаемого файла.

1 голос
/ 06 июня 2009

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

Это второй вопрос, который вы задали в этой области. Одна из основных причин использования языка программирования высокого уровня, такого как C, заключается в том, что вам не нужно беспокоиться об этих проблемах.

...