Teilen über


C28651

Warnung C28651: Statische Initialisierung bewirkt, dass die Kopie auf Schreibseiten aufgrund von Memberfunktionszeigern kopiert wird.

Statische Initialisierer globaler oder statischer Konstvariablen können häufig zur Kompilierungszeit vollständig ausgewertet werden und somit in RDATA generiert werden. Wenn es sich bei einem Initialisierer jedoch um eine Zeiger-zu-Member-Funktion handelt, bei der es sich um eine nicht statische Funktion handelt, kann der gesamte Initialisierer auf Kopier-on-Write-Seiten platziert werden, die leistungseinbußen haben.

Bei Binärdateien, die schnelles Laden und Minimieren von Kopien auf Schreibseiten erfordern, sollten Sie sicherstellen, dass alle Funktionszeiger im statischen Initialisierer keine Zeiger-zu-Member-Funktionen sind. Wenn eine Zeiger-zu-Member-Funktion erforderlich ist, schreiben Sie eine einfache statische Memberfunktion, die einen Aufruf der tatsächlichen Memberfunktion umschließt.

Beispiel

Im folgenden Codebeispiel wird dieser Fehler generiert.

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);
}
}  

Im folgenden Codebeispiel wird dieser Fehler vermieden.

class MyClass
{
    ...
    bool memberFunc();
    static bool memberFuncWrap(MyClass *thisPtr)
        { return thisPtr->memberFunc(); }
    ...
};
const StructType MyStruct[] = {
    ...
    &MyClass::memberFuncWrap,
    ...
};