Win32編程中使用了大量的結構。很多時候,只有一些字段被使用,其他所有字段都被設置爲零。例如:清零構造函數中的struct
STARTUPINFO startupInfo; // has more than 10 member variables
ZeroMemory(&startupInfo, sizeof(startupInfo)); //zero out
startupInfo.cb = sizeof(startupInfo); //setting size is required according to MSDN
startupInfo.dwFlags = STARTF_FORCEOFFFEEDBACK;
//Now call CreateProcess() passing the startupInfo into it
我想停止複製粘貼這樣的代碼,而是使用一個抽象,將關心歸零和設置參數。假設我只需要像在示例中那樣初始化結構,並且不需要其他調整。以下是一個很好的解決方案嗎?什麼是可能的問題?
class CStartupInfo : public STARTUPINFO {
public:
CStartupInfo()
{
ZeroMemory(this, sizeof(STARTUPINFO));
cb = sizeof(STARTUPINFO);
dwFlags = STARTF_FORCEOFFFEEDBACK;
}
};
我特別關心的ZeroMemory()調用 - 看起來像我完全控制代碼和類沒有虛函數表,並調用ZeroMemory()這個方法是安全的,有兩者之間沒有大的區別代碼片段除了後者提供抽象。是否有任何警告?
好的解決方案。爲什麼?因爲編譯器會通過NRVO完全優化它! *沒有第二個副本*的結構將在堆棧上創建,不會複製返回值(如果上面的代碼在初始化中使用)。該功能簡單而純粹地具有零開銷。 – 2009-04-22 12:25:12
@Konrad,啊是的,我忘了NRVO:http://msdn.microsoft.com/en-us/library/ms364057.aspx – JaredPar 2009-04-22 14:41:06