Почему глобальные и статические переменные инициализируются значениями по умолчанию? - PullRequest
60 голосов
/ 19 января 2010

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

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

Ответы [ 5 ]

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

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

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

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

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

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

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

24 голосов
/ 19 января 2010

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

17 голосов
/ 04 января 2014

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

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

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

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

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

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

6 голосов
/ 19 января 2010

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

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

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

3 голосов
/ 21 июля 2014

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

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

...