C28651

警告 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,
    ...
};