2010-05-22 65 views
0

即时通讯使用:我应该每次使用全局变量还是调用函数? 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作为一个全局变量或致电GetOS () 每次?

从性能的角度来看,最好的选择是什么。

+0

很难说你的函数GetOS是干什么的,什么是调用呼叫不变的。当每隔几分钟运行一次以保证一个全局变量时,它将不得不花费很长时间执行,但我们无法从所提供的信息中知道这一点。 – msw 2010-05-22 02:22:51

回答

2

从性能的角度来看,最佳选择是什么?

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

虽然它真的很重要吗?

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

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

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

+0

我喜欢那段代码,我有一个问题... 应该在第一次执行完成使用它之后“解除”由ZeroMemory()分配的内存吗?如果是这样,怎么样? – extintor 2010-05-22 02:53:36

+0

除非我对ZeroMemory做什么感到困惑,在这里没有内存分配,在堆栈上分配了osve变量,而ZeroMemory调用只是清除了堆栈中的这些字节。从这个程序返回时清理将自动发生 – luke 2010-05-22 03:01:34

+0

噢好吧,我刚刚开始使用cpp,非常感谢。 – extintor 2010-05-22 03:17:36

相关问题