我应该每次使用全局var还是调用函数? C ++

时间:2010-05-22 02:13:21

标签: c++ visual-c++

我正在使用:

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 作为全局var还是调用GetOS()?

从表现的角度来看,最佳选择是什么。

2 个答案:

答案 0 :(得分:2)

  

从表现的角度来看,最佳选择是什么。

即使函数为空,使用变量也比函数调用更有效。只需确保在拥有单个线程时初始化此变量,然后不要更改它。

这真的很重要吗?

从提供的信息来看,很难说,但这种运行速度非常快非常重要吗?你经常使用它吗?特别是在多线程环境中进行函数调用更安全。如果您不确定这是程序中的瓶颈,请不要过早优化。以最安全的方式编写代码。

答案 1 :(得分:2)

你总是可以缓存结果:

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;
}

这样您只需计算一次,但您可以将逻辑和初始化保存在一个地方。缓存变量的静态范围还确保只有此过程才能访问变量,因此它使它比常规全局变量更安全一些。我只缓存布尔结果,如果需要缓存更多信息,只需添加更多静态变量。