Должен ли я использовать глобальную переменную или вызывать функцию каждый раз?C ++ - PullRequest
0 голосов
/ 22 мая 2010

Я использую:

bool GetOS(LPTSTR pszOS)
{
   OSVERSIONINFOEX osve;
   BOOL bOsVersionInfoEx;

   ZeroMemory(&osve, sizeof(OSVERSIONINFOEX));

   osve.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

   if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osve)) )
      return false;

   TCHAR buf[80];
   StringCchPrintf( buf, 80, TEXT("%u.%u.%u.%u"),
      osve.dwPlatformId,
      osve.dwMajorVersion,
      osve.dwMinorVersion,
      osve.dwBuildNumber);

   StringCchCat(pszOS, BUFSIZE, buf);

   return true;
}

, чтобы получить версию для Windows, и я планирую использовать pszOS каждые несколько минут,

Стоит ли использовать pszOS в качестве глобальной переменной или каждый раз вызывать GetOS ()?

Каков наилучший вариант с точки зрения производительности.

Ответы [ 2 ]

2 голосов
/ 22 мая 2010

вы всегда можете просто кешировать результат:

bool GetOS(LPTSTR pszOS)
{
    static bool has_cached = false;
    static bool result = false;
    static TCHAR buf[80];
    if(!has_cached)
    {
        has_cached = true;
        OSVERSIONINFOEX osve;
        BOOL bOsVersionInfoEx;

        ZeroMemory(&osve, sizeof(OSVERSIONINFOEX));

        osve.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

        if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osve)) )
        {
            result = false;
        }
        else
        {
            StringCchPrintf( buf, 80, TEXT("%u.%u.%u.%u"),
                             osve.dwPlatformId,
                             osve.dwMajorVersion,
                             osve.dwMinorVersion,
                             osve.dwBuildNumber);



            result = true;
        }
    }
    if(result)
        StringCchCat(pszOS, BUFSIZE, buf);
    return result;
}

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

2 голосов
/ 22 мая 2010

Какой самый лучший вариант с точки зрения производительности.

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

Разве это действительно имеет значение?

Из предоставленной информации трудно сказать, но действительно ли важно, что это работает очень быстро? Вы используете это очень, очень часто? Безопаснее делать вызов функции, особенно в многопоточной среде. Не оптимизируйте преждевременно, если вы не уверены, что это узкое место в вашей программе. Код наиболее безопасным способом.

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