C28651
advertencia C28651: el inicializador estático provoca la copia en páginas de escritura debido a punteros de función miembro
Los inicializadores estáticos de variables const globales o estáticas a menudo se pueden evaluar completamente en tiempo de compilación, por lo que se generan en RDATA. Sin embargo, si algún inicializador es una función de puntero a miembro donde es una función no estática, todo el inicializador se puede colocar en páginas de copia en escritura, lo que tiene un costo de rendimiento.
En el caso de los archivos binarios que requieren carga rápida y minimización de la copia en páginas de escritura, considere la posibilidad de asegurarse de que todos los punteros de función del inicializador estático no son funciones de puntero a miembro. Si se requiere una función miembro de puntero a miembro, escriba una función miembro estática simple que encapsula una llamada a la función miembro real.
Ejemplo
El ejemplo de código siguiente genera este error.
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);
}
}
En el ejemplo de código siguiente se evita este error.
class MyClass
{
...
bool memberFunc();
static bool memberFuncWrap(MyClass *thisPtr)
{ return thisPtr->memberFunc(); }
...
};
const StructType MyStruct[] = {
...
&MyClass::memberFuncWrap,
...
};