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


C28651

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

Статические инициализаторы глобальных или статических переменных константа часто могут быть полностью оценены во время компиляции, поэтому создаются в 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,
    ...
};