Должны ли статические объекты вообще быть инициализированы?

Из книги «Прагматика языка программирования» Скотта

Время жизни объекта обычно соответствует одному из трех основных механизмов распределения памяти, используемых для управления пространством объекта:

  1. Статическим объектам присваивается абсолютный адрес, который сохраняется на протяжении всего выполнения программы.

  2. Объекты стека выделяются и освобождаются в порядке «последний пришел – первый ушел», обычно в сочетании с вызовами и возвратами подпрограмм.

  3. Объекты кучи могут быть выделены и освобождены в произвольное время. Для них требуется более общий (и дорогой) алгоритм управления хранилищем.

Например, в C статические объекты должны быть инициализированы константными выражениями (выражениями, которые можно вычислить во время компиляции).

Я не уверен, так ли это в других языках и даже в каких других языках также есть статические объекты.

В общем, должны ли статические объекты быть инициализированы? При инициализации должны ли они инициализироваться выражениями, которые можно вычислить во время компиляции?

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

Спасибо.


person Tim    schedule 15.09.2017    source источник
comment
Короткий ответ: «нет». Однако они, вероятно, должны избегать неинициализированных проблем позже в программе.   -  person Serge    schedule 16.09.2017
comment
Не совсем верно, переменная static по умолчанию инициализируется 0 (или эквивалентом), переменная non static должна быть инициализирована на самом деле, иначе в вашем стеке памяти будет какое-то мусорное значение.   -  person James Maa    schedule 16.09.2017


Ответы (1)


Переменная static будет автоматически инициализирована "нулем", если только вы не инициализируете ее явно.

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

person Some programmer dude    schedule 15.09.2017
comment
Спасибо. Под инициализацией я подразумеваю явную или неявную, а не неинициализацию. Значит, вы имеете в виду, что статические объекты должны быть инициализированы? - person Tim; 16.09.2017
comment
@Tim Нет, они будут автоматически инициализированы компилятором до вызова main, если вы не сделаете это явно. - person Some programmer dude; 16.09.2017
comment
Позвольте мне перефразировать мой вопрос: вообще, могут ли статические объекты оставаться неинициализированными ни программами, ни компиляторами? - person Tim; 16.09.2017
comment
@ Тим В таком случае нет. Они всегда будут инициализированы (если только у вас нет ошибочного компилятора или процедуры запуска). См., например. этот старый ответ с цитатами из стандарта. - person Some programmer dude; 16.09.2017
comment
Насколько вам известно, так ли это в других языках? - person Tim; 16.09.2017
comment
@Tim - Память для глобальных переменных (длительность статического хранения) обычно обнуляется операционной системой, чтобы вы не могли просматривать данные, используемые предыдущими программами. C документирует это как требование, но эффект будет таким же для других языков, независимо от того, требуют они этого или нет. - person Bo Persson; 16.09.2017
comment
@Бо: Спасибо. Как насчет статических переменных, локальных для функций? - person Tim; 16.09.2017
comment
@Tim Даже в этом случае переменная static не останется неинициализированной. - person Some programmer dude; 16.09.2017
comment
@Someprogrammerdude Из stackoverflow.com/a/41125798, если значение неизвестно во время компиляции для static const в области функции, оно может незаметно замедлить работу вашей функции (очень небольшой бит), поскольку она должна инициализировать значение во время выполнения при первом вызове функции. Значит ли это, что статические объекты могут быть инициализированы во время выполнения, если значение их инициализатора неизвестно во время компиляции? - person Tim; 16.09.2017
comment
@Tim Возможно, он может быть инициализирован во время выполнения или во время компиляции. Однако он все равно будет инициализирован. Как я уже говорил, все static переменные так или иначе будут инициализированы. - person Some programmer dude; 16.09.2017
comment
@Someprogrammerdude Я только что заметил, что другой пост посвящен C ++. Может быть, C по-прежнему требует инициализации статических объектов во время компиляции, а C++ ослабляет его, чтобы разрешить инициализацию во время выполнения? - person Tim; 16.09.2017
comment
@ Тим Я, наверное, давно должен был спросить, но почему ты спрашиваешь? Это простое любопытство? Или это какая-то конкретная проблема, связанная с инициализацией переменной static, которая заставила вас задать этот вопрос? Возможно, тогда вам следует спросить об этой проблеме? - person Some programmer dude; 16.09.2017
comment
@Someprogrammerdude Это просто мой вопрос, когда я читал книгу «Прагматика языка программирования» и размышлял о своем прошлом опыте работы с C некоторое время назад. Если вам нужна конкретная проблема, чтобы ответить на вопрос, или никакая конкретная проблема не вызывает у вас дискомфорта, приношу свои извинения. - person Tim; 16.09.2017