GCC использует скрытый флаг, указывающий, была ли переменная инициализирована.Нет способа получить к этому доступ.Тем не менее, они на самом деле не отслеживают «первый раз», а скорее, была ли переменная инициализирована.Рассмотрим следующее:
void func()
{
static T a;
static T b;
}
Но стандарт фактически разрешил бы их инициализацию разными потоками.Так что, если это произойдет, кто получил их первым.При проверке дизассемблирования gcc кажется, что каждый обрабатывается со своей собственной блокировкой, по крайней мере, в неоптимизированном режиме, код сильно меняется в оптимизированном режиме (поэтому, более того, «первый раз» не определен четко).1005 * Кроме того, как отмечает Марк в своем комментарии, это во многом зависит от того, какой тип вы используете, когда завершена инициализация.Простые типы могут, не гарантируется, инициализироваться глобально, другие действительно будут ждать, пока функция будет вызвана первой.
Почему вам все равно нужно знать первый раз при вводе?