Явная статическая инициализация к нулю в C ++ - PullRequest
2 голосов
/ 10 января 2012

Мне жаль задавать этот тривиальный вопрос, но я не смог найти однозначного ответа: если у меня есть явная статическая инициализация к нулю, это нулевая инициализация или инициализация с постоянным выражением?Скажите, если у меня есть

a.hpp:

class A { ... static int x; }

a.cpp;

int A::x = 0;

Сколько раз 0 будет присвоено x?Один раз во время инициализации нуля или дважды во время инициализации нуля и инициализации с постоянным выражением?

1 Ответ

2 голосов
/ 10 января 2012

Значение переменной будет 0 до того, как будет выполнен любой ваш код.Как это происходит, во многом зависит от системы;Один из типичных подходов - это чтение образа даты с диска при загрузке программы.Формально у вас нулевая инициализация, за которой следует статическая инициализация, но соответствующая реализация никак не может сказать, и я никогда не слышал о реализации, которая разделяет их.

Под Unix, по крайней мере, в его старшейи более традиционные версии, неинициализированные статические переменные были помещены в сегмент bs, статически инициализированные переменные в сегмент данных.Исполняемый файл на диске содержал изображение сегмента данных, которое было скопировано в память;все байты в сегменте bs были установлены на 0. На современной машине с выгружаемой виртуальной памятью я ожидал бы аналогичного поведения с той разницей, что инициализация будет отложена до первого доступа к странице.

Я был бы очень удивлен, если бы Windows обрабатывал это по-другому (за исключением имен сегментов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...