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