Здравствуйте, jazzer, Вы писали:
J>нужно. И заодно нужно убедиться, что инициализация id нулем происходит "до всего", чтоб не было никаких обнуляющих действий в рантайме (по идее, она должна лежать в памяти, которая забита нулями сразу при старте приложения).
Имя этой идее — стандарт С++
4.
The zero-initialization (8.5) of all local objects with static storage duration (3.7.1) is performed before any other initialization takes place.
A local object of POD type (3.9) with static storage duration initialized with constant-expressions is initialized before its block is first entered.
An implementation is permitted to perform early initialization of other local objects with static storage duration under the same conditions that an implementation is permitted to statically initialize an object with static storage duration in namespace scope (3.6.2).
Otherwise such an object is initialized the first time control passes through its declaration; such an object is considered initialized upon the completion of its initialization.
То есть, с нулём — однозначно будет от начала времён; с ненулевой константой — заведомо, не позднее, чем инициализуруются внешние статики (от начала времён до входа в main() — в любом случае, однопоточный рантайм); с неконстантой — тут уже как повезёт.
Чисто теоретически, можно поймать гонку и в однопоточном рантайме: если некий обработчик асинхронного события (прерывания, сигнала) будет зарегистрирован на этапе статической инициализации и выполнится прямо в момент инициализации статиков этого модуля. Или, опять же, стартовать поток ОС в обход сишного рантайма до входа в main().
Но это уже совсем сумрачный тевтонский гений.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>