警告 C28651:静态初始值设定项因成员函数指针导致写入页上复制
全局或静态常量变量的静态初始值设定项通常在编译时完全计算,从而在 RDATA 中生成。 但是,如果任何初始值设定项是指针到成员函数,而该函数是非静态函数,则整个初始值设定项可以放置在写入时复制页中,这具有性能成本。
对于需要快速加载和最小化写入页上复制的二进制文件,请考虑确保静态初始值设定项中的所有函数指针都不是指针到成员函数。 如果需要指针到成员函数,请编写一个简单的静态成员函数,用于包装对实际成员函数的调用。
示例
下面的代码示例生成此错误。
void Func()
{
WCHAR*pszBuf=newWCHAR[MAX_PATH];
DPA_InsertPtr(_hdpa, DA_LAST, pszBuf);
}
void CleanupDPA()
{
int count = DPA_GetCount(_hdpa);
for (int i = 0; i < count; i++)
{
delete [] (LPWSTR)DPA_GetPtr(_hdpa, i);
}
}
下面的代码示例避免了此错误。
class MyClass
{
...
bool memberFunc();
static bool memberFuncWrap(MyClass *thisPtr)
{ return thisPtr->memberFunc(); }
...
};
const StructType MyStruct[] = {
...
&MyClass::memberFuncWrap,
...
};