Sdílet prostřednictvím


C28651

upozornění C28651: Statický inicializátor způsobuje kopírování na stránkách zápisu kvůli ukazatelům členské funkce

Statické inicializátory globálních nebo statických proměnných const je často možné plně vyhodnotit v době kompilace, čímž se vygenerují v RDATA. Pokud je však jakýkoli inicializátor funkcí ukazatele na člen, kde se jedná o nestatické funkce, může být celý inicializátor umístěn na stránkách kopírování na zápis, což má náklady na výkon.

U binárních souborů, které vyžadují rychlé načítání a minimalizaci kopírování na stránkách zápisu, zvažte, že všechny ukazatele funkce ve statickém inicializátoru nejsou funkcemi ukazatele na členy. Pokud je vyžadována funkce ukazatele na člena, napište jednoduchou statickou členovou funkci, která zabalí volání skutečné členské funkce.

příklad

Následující příklad kódu vygeneruje tuto chybu.

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

Následující příklad kódu zabrání této chybě.

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