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