2013-11-15 3 views
0

У меня есть несколько функций в программе, которую я пишу, которая использует значение, которое мне нужно вычислить с очень медленной функцией. Это значение будет меняться при каждом повторном запуске программы, поэтому я не могу просто сохранить статическое значение. Ниже приведен пример.Статическое ключевое слово сохраняет значение, возвращаемое функцией?

void this_gets_called_frequently() 
{ 
    static int value = slow_function(); 

    //do stuff with the above value 
} 

Моя основная проблема здесь не в одной из программ, которые не работают, а не в аккуратности. Я действительно не хочу инициализировать глобальную переменную и хранить в ней значение, поскольку она не будет меняться после вычисления. Будет ли использование ключевого слова static таким образом, как показано выше, только вызывать функцию выше, которую нужно вычислить один раз? Будет ли добавлено ключевое слово const?

Спасибо всем, на это был дан ответ!

+1

У вас есть это точно - статическая локальная переменная будет инициализирована только один раз, когда первый фрагмент кода выполняется. –

+0

@MarkRansom: если 'slow_function()' выбрасывает исключение;) –

+0

Да, если вы не находитесь на C++ 03 и вызываете 'this_gets_called_frequently' из нескольких потоков. IIRC C++ 11 молча гарантирует, что 'value' инициализируется только один раз только одним потоком. – sbabbi

ответ

2

Да, инициализация локальной переменной static произойдет не чаще одного раза (хотя я помню, что некоторые версии компилятора могут иметь проблемы с многопотоковой обработкой здесь). const не требуется, в этом случае это в основном вопрос удобочитаемости и вкуса.

0

Будет ли использование статического ключевого слова способом, показанным выше, только вызывать функцию выше, которую нужно рассчитать один раз?

Да, на первый вызов this_gets_called_frequently

бы константное ключевое слово добавило там помочь?

No. Но добавьте const для документации.

0

Использование может использовать локальные переменные потока из C++ 11, если они доступны в вашем компиляторе. Если вы работаете в Windows, вы можете использовать аналогичный API TlsAlloc. Он существует с самого начала Win32.

+0

Это потребует вызова 'slow_function' для каждого потока. – Inspired

+0

Правда. Но это может быть приемлемым и даже желательным. –

Смежные вопросы