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,
...
};