Мне кажется, именно так (ранее мы долго обсуждали этот вопрос о переполнении стека в ветке комментариев):
- Если инициализация или деструктор объекта с областью пространства имен (которые являются объектами со статической продолжительностью хранения) не имеет побочных эффектов, объект может быть оптимизирован, если в его блоке перевода не используется функция или объект.
- Для объектов, инициализация или уничтожение которых вызывает побочные эффекты, компилятор может не оптимизировать эту переменную, даже если не используются объекты или функции ее единиц перевода.
В любом случае, компилятор должен инициализировать объекты до того, как это будет сделано, но не обязательно до main. Я проводил тесты, потому что кто-то из stackoverflow сказал, что gcc эффективно оптимизирует инициализацию объектов, имеющих побочные эффекты, если такого применения нет. Я проверял это сейчас, и я видел, что gcc этого не делает. Кроме того, насколько я понимаю Стандарт, в любом случае это запрещено.
Достаточно, если вы просто берете адрес объекта или функции единицы перевода объекта, который вы хотите инициализировать. Чтобы быть в безопасности, лучше всегда делать это, даже для объектов, имеющих инициализации с побочными эффектами. Предполагая, что ваш друг прав, я думаю, что для единицы перевода main, main
всегда рассматривается как используется , так что условие немедленно удовлетворяется. Правила можно найти в 3.6.2p3
, 3.7.1p2
и 3.2p2
(определение использовать ), 1.9p7
(определение побочный эффект ).