2010-05-22 61 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

相關問題