Почему глобальные и статические переменные инициализируются значениями по умолчанию?

В C / C ++, почему глобальные переменные и статические переменные инициализируются значениями по умолчанию?

Почему бы не оставить его с просто мусорными ценностями? Есть ли особые причины для этого?

  1. Безопасность : оставляя только память, будет утечка информации из других процессов или ядра.

  2. Эффективность : значения бесполезны до тех пор, пока они не будут инициализированы, и более эффективно обнулить их в блоке с развернутыми циклами. ОС может даже обнулять лишние страницы, когда система в противном случае не работает, а не когда клиент или пользователь ждут запуска программы.

  3. Воспроизводимость : оставление значений само по себе сделает поведение программы неповторимым, что затруднит поиск ошибок.

  4. Elegance : он чище, если программы могут начинаться с 0 без необходимости загромождать код инициализаторами по умолчанию.

Тогда можно было бы задаться вопросом, почему class auto хранения запускается как мусор. Ответ двоякий:

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

  2. Может существовать квадратичное (или иное) время выполнения, связанное с инициализацией auto (locals) функций во что угодно. Функция может не использовать какой-либо или весь большой массив, скажем, для любого данного вызова, и его можно было бы вызывать тысячи или миллионы раз. Инициализация статики и глобалов, OTOH, должна произойти только один раз.

Поскольку при правильном взаимодействии ОС 0 инициализация статики и глобальных переменных может быть реализована без дополнительных затрат времени исполнения.

Раздел 6.7.8 Инициализация стандарта C99 (n1256) отвечает на этот вопрос:

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

– если он имеет тип указателя, он инициализируется нулевым указателем;

– если он имеет арифметический тип, он инициализируется (положительным или без знака) нулем;

– если это совокупность, каждый член инициализируется (рекурсивно) в соответствии с этими правилами;

– если это объединение, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правилами.

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

Если бы у вас не было обнуления статики, вы бы совершенно не могли бы сказать на этом этапе наверняка, если что-то было инициализировано AT ALL, и, короче говоря, мир C ++ разлетел бы и основные вещи, такие как одиночные (или любые динамические статические init) будет просто перестать работать.

Ответ с пулевыми точками – восторженный, но немного глупый. Все они могут применяться к нестатистическому распределению, но это не сделано (ну, иногда, но не обычно).

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

Источник: Википедия

  • преобразование двумерного массива в указатель на указатель
  • глобальная переменная в C статична или нет?
  • Статическая переменная шаблона
  • Java: статический и внутренний class
  • Как создать экземпляр нестационарного внутреннего classа в статическом методе
  • Должны ли статические статические методы C #, которые * могут быть статическими?
  • Синхронизированные статические методы Java: блокировка объекта или classа
  • Статический массив против динамического массива в C ++
  • Когда НЕ использовать статическое ключевое слово в Java?
  • Как я могу получить содержимое ресурса из статического контекста?
  • Как я имитирую статические методы в classе с помощью easymock?
  • Давайте будем гением компьютера.