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

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

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

61
задан Peter Mortensen 30 January 2016 в 17:54
поделиться

3 ответа

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

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

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

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

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

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

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

68
ответ дан 24 November 2019 в 17:14
поделиться

Сопоставимый интерфейс содержит метод compeyTo (obj) , который принимает только один аргумент и сравнивает себя с другим экземпляром или объектами того же класса.

Интерфейс Comparator содержит метод compare (obj1, obj2) , который принимает два аргумента и сравнивает значение двух объектов из одного или разных классов.

-121--728616-

Да, это возможно с помощью нового (ну это уже не новое) замкнутого питателя (так как JUnit 4,5 ), который запускает все статические внутренние классы внешнего класса.

Чтобы использовать его, просто аннотируйте внешний класс с помощью @ RunWith (Enclosed.class) и сделайте внутренние классы статическими.

@RunWith(Enclosed.class)
public class WorkerServiceTest {

    public static class RaiseErrorTest extends AbstractDbUnitTest{
        @Test
        public void testSomething(){
        } 

        ...
    }

    ...
}

И mvn тест будет выполнять их.

-121--2948988-

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

24
ответ дан 24 November 2019 в 17:14
поделиться

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

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

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

6
ответ дан 24 November 2019 в 17:14
поделиться