Delen via


C28651

waarschuwing C28651: Statische initialisatiefunctie veroorzaakt kopie op schrijfpagina's vanwege puntwijzers voor lidfuncties

Statische initialisaties van globale of statische const-variabelen kunnen vaak volledig worden geëvalueerd tijdens het compileren, dus gegenereerd in RDATA. Als een initialisatiefunctie echter een pointer-to-member-functie is waarbij het een niet-statische functie is, kan de volledige initialisatiefunctie worden geplaatst op kopieer-op-schrijfpagina's, die een prestatiekosten hebben.

Voor binaire bestanden waarvoor snel laden en het minimaliseren van kopiëren op schrijfpagina's is vereist, kunt u ervoor zorgen dat alle functiepointers in de statische initialisatiefunctie geen aanwijzer-naar-lid-functies zijn. Als een aanwijzer-naar-lid-functie is vereist, schrijft u een eenvoudige statische lidfunctie waarmee een aanroep naar de werkelijke lidfunctie wordt verpakt.

voorbeeld

In het volgende codevoorbeeld wordt deze fout gegenereerd.

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

In het volgende codevoorbeeld wordt deze fout voorkomen.

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