C28651

avviso C28651: inizializzatore statico causa la copia nelle pagine di scrittura a causa di puntatori a funzione membro

Gli inizializzatori statici di variabili const globali o statiche spesso possono essere valutati completamente in fase di compilazione, quindi generati in RDATA. Tuttavia, se un inizializzatore è una funzione puntatore a membro in cui si tratta di una funzione non statica, l'intero inizializzatore può essere inserito nelle pagine copy-on-write, con un costo delle prestazioni.

Per i file binari che richiedono caricamento rapido e riduzione al minimo della copia nelle pagine di scrittura, è consigliabile assicurarsi che tutti i puntatori a funzione nell'inizializzatore statico non siano funzioni puntatore a membro. Se è necessaria una funzione puntatore a membro, scrivere una semplice funzione membro statica che esegue il wrapping di una chiamata alla funzione membro effettiva.

Esempio

L'esempio di codice seguente genera questo errore.

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

Nell'esempio di codice seguente viene evitato questo errore.

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