Compartilhar via


C28651

aviso C28651: inicializador estático causa cópia em páginas de gravação devido a ponteiros de função membro

Inicializadores estáticos de variáveis const globais ou estáticas geralmente podem ser totalmente avaliados em tempo de compilação, portanto gerados no RDATA. No entanto, se qualquer inicializador for uma função de ponteiro para membro em que é uma função não estática, todo o inicializador poderá ser colocado em páginas de cópia na gravação, o que tem um custo de desempenho.

Para binários que exigem carregamento rápido e minimização de cópia em páginas de gravação, considere garantir que todos os ponteiros de função no inicializador estático não sejam funções de ponteiro para membro. Se uma função de ponteiro para membro for necessária, escreva uma função membro estática simples que encapsula uma chamada para a função membro real.

Exemplo

O exemplo de código a seguir gera esse erro.

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

O exemplo de código a seguir evita esse erro.

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