Определить первый вызов, используя уже существующие статические переменные? - PullRequest
0 голосов
/ 10 марта 2012

Есть ли способ определить, вызывается ли функция в первый раз, путем определения внутренних (скрытых?) Переменных, которые GCC использует для упрощения статических переменных (переменных, уже существующих в моей функции)?

Я надеюсь получить эти переменные из кода C ++.

Ответы [ 2 ]

5 голосов
/ 10 марта 2012

Невозможно полагаться на внутренние компоненты компилятора, и даже если вы попробуете, нет гарантии, что это не изменится в следующей версии.

Используйте эту распространенную идиому:

static bool firsttime = true;
if (firsttime)
{
    firsttime = false;
    // other stuff here
}
2 голосов
/ 10 марта 2012

GCC использует скрытый флаг, указывающий, была ли переменная инициализирована.Нет способа получить к этому доступ.Тем не менее, они на самом деле не отслеживают «первый раз», а скорее, была ли переменная инициализирована.Рассмотрим следующее:

void func()
{
   static T a;
   static T b;
}

Но стандарт фактически разрешил бы их инициализацию разными потоками.Так что, если это произойдет, кто получил их первым.При проверке дизассемблирования gcc кажется, что каждый обрабатывается со своей собственной блокировкой, по крайней мере, в неоптимизированном режиме, код сильно меняется в оптимизированном режиме (поэтому, более того, «первый раз» не определен четко).1005 * Кроме того, как отмечает Марк в своем комментарии, это во многом зависит от того, какой тип вы используете, когда завершена инициализация.Простые типы могут, не гарантируется, инициализироваться глобально, другие действительно будут ждать, пока функция будет вызвана первой.

Почему вам все равно нужно знать первый раз при вводе?

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