C28651
Warnung C28651: Statischer Initialisierer verursacht das Kopieren auf Schreibseiten aufgrund von Memberfunktionszeigern
Statische Initialisierer globaler oder statischer Constvariablen können häufig zur Kompilierzeit vollständig ausgewertet und daher in RDATA generiert werden. Wenn es sich bei einem Initialisierer jedoch um eine Zeiger-auf-Member-Funktion handelt, bei der es sich um eine nicht statische Funktion handelt, kann der gesamte Initialisierer in Kopiervorgängen platziert werden, was zu Leistungskosten führt.
Für Binärdateien, die ein schnelles Laden und Minimieren des Kopierens auf Schreibseiten erfordern, sollten Sie sicherstellen, dass alle Funktionszeiger im statischen Initialisierer keine Zeiger-auf-Member-Funktionen sind. Wenn eine Zeiger-auf-Member-Funktion erforderlich ist, schreiben Sie eine einfache statische Memberfunktion, die einen Aufruf der eigentlichen 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,
...
};