Поделиться через


C28651

предупреждение C28651: статический инициализатор вызывает копирование на страницах записи из-за указателей функций-членов

Статические инициализаторы глобальных или статических переменных const часто могут быть полностью оценены во время компиляции, поэтому они создаются в RDATA. Однако если любой инициализатор является функцией указателя на член, где это нестатическая функция, весь инициализатор может быть помещен в страницы копирования при записи, что имеет высокую производительность.

Для двоичных файлов, требующих быстрой загрузки и минимизации копирования на страницах записи, рекомендуется убедиться, что все указатели функций в статичном инициализаторе не являются функциями указателя на члены. Если требуется функция указателя на член, напишите простую статическую функцию-член, которая заключает вызов фактической функции-члена.

Примере

Эта ошибка возникает в следующем примере кода.

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

Следующий пример кода позволяет избежать этой ошибки.

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