Различие между 'глобальными' и 'глобальными помехами'

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

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

23
задан nbro 9 March 2016 в 11:09
поделиться

4 ответа

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

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

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

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

28
ответ дан 29 November 2019 в 01:07
поделиться

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

18
ответ дан 29 November 2019 в 01:07
поделиться

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

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

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

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

7
ответ дан 29 November 2019 в 01:07
поделиться

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

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

1
ответ дан 29 November 2019 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: